-
Notifications
You must be signed in to change notification settings - Fork 0
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Member 생성, 조회, 수정 구현 #12
Changes from 6 commits
2ed5212
8fe3efa
29b2e84
6c428c3
08c6823
e379980
65d6413
b5f1e96
86e6b33
af3eb16
23381cc
178ec0f
fb72a9b
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,61 @@ | ||
package com.gdgoc.study_group.member.application; | ||
|
||
import com.gdgoc.study_group.member.dao.MemberRepository; | ||
import com.gdgoc.study_group.member.domain.Member; | ||
import com.gdgoc.study_group.member.dto.request.MemberCreateRequestDto; | ||
import com.gdgoc.study_group.member.dto.request.MemberUpdateRequestDto; | ||
import java.util.NoSuchElementException; | ||
import lombok.RequiredArgsConstructor; | ||
import org.springframework.stereotype.Service; | ||
import org.springframework.transaction.annotation.Transactional; | ||
|
||
@Service | ||
@RequiredArgsConstructor | ||
public class MemberService { | ||
|
||
private final MemberRepository memberRepository; | ||
|
||
/** | ||
* 새 멤버를 생성합니다. | ||
* | ||
* @param request 새로 만들 멤버 정보 | ||
* @return Member 형태로 반환 | ||
*/ | ||
public Member createMember(MemberCreateRequestDto request) { | ||
|
||
Member newMember = | ||
Member.builder() | ||
.name(request.getName()) | ||
.github(request.getGithub()) | ||
.studentNumber(request.getStudentNumber()) | ||
.build(); | ||
|
||
return memberRepository.save(newMember); | ||
} | ||
|
||
/** | ||
* 멤버를 조회합니다. | ||
* | ||
* @param memberId 멤버를 조회할 정보 | ||
* @return Member 형태로 반환 | ||
*/ | ||
public Member getMember(Long memberId) { | ||
return memberRepository | ||
.findById(memberId) | ||
.orElseThrow(() -> new NoSuchElementException("member not found")); | ||
} | ||
|
||
/** | ||
* 멤버가 정보를 수정합니다. | ||
* | ||
* @param memberId 멤버를 조회할 정보 | ||
* @param request 수정할 정보 | ||
*/ | ||
@Transactional | ||
public void updateMember(Long memberId, MemberUpdateRequestDto request) { | ||
|
||
Member member = getMember(memberId); | ||
|
||
member.updateMember(request.getName(), request.getGithub(), request.getStudentNumber()); | ||
} | ||
} |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,87 @@ | ||
package com.gdgoc.study_group.member.controller; | ||
|
||
import com.gdgoc.study_group.member.application.MemberService; | ||
import com.gdgoc.study_group.member.domain.Member; | ||
import com.gdgoc.study_group.member.dto.request.MemberCreateRequestDto; | ||
import com.gdgoc.study_group.member.dto.request.MemberUpdateRequestDto; | ||
import com.gdgoc.study_group.member.dto.response.MemberCreateResponseDto; | ||
import com.gdgoc.study_group.member.dto.response.MemberGetResponseDto; | ||
import lombok.RequiredArgsConstructor; | ||
import org.springframework.http.HttpStatus; | ||
import org.springframework.http.ResponseEntity; | ||
import org.springframework.web.bind.annotation.*; | ||
|
||
@RestController | ||
@RequestMapping("/users") | ||
@RequiredArgsConstructor | ||
public class MemberController { | ||
private final MemberService memberService; | ||
|
||
/** | ||
* 새 멤버를 생성합니다. | ||
* | ||
* @param request 새로 만들 멤버 정보 | ||
* @return 성공하면 생성 성공 메시지와 생성된 회원의 ID 반환 | ||
*/ | ||
@PostMapping | ||
public ResponseEntity<?> createMember(@RequestBody MemberCreateRequestDto request) { | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more.
|
||
Member createdMember = memberService.createMember(request); | ||
|
||
MemberCreateResponseDto response = MemberCreateResponseDto.builder() | ||
.studentId(createdMember.getId().toString()) | ||
.build(); | ||
|
||
return ResponseEntity.status(HttpStatus.CREATED).body(response); | ||
} | ||
|
||
/** | ||
* 멤버를 조회합니다. | ||
* | ||
* @param memberId 멤버를 조회할 정보 | ||
* @return 성공하면 성공 메시지와 회원 정보 반환 | ||
*/ | ||
@GetMapping("/{id}/profile") | ||
public ResponseEntity<MemberGetResponseDto> getMember( | ||
@PathVariable("id") Long memberId | ||
// @RequestHeader("Authorization") String authorizationHeader | ||
) { | ||
// // Bearer 토큰 추출 | ||
// String token = authorizationHeader.replace("Bearer ", ""); | ||
// | ||
// // TODO: JWT 토큰 검증 로직 추가 | ||
|
||
Member member = memberService.getMember(memberId); | ||
|
||
MemberGetResponseDto response = MemberGetResponseDto.builder() | ||
.studentId(member.getId().toString()) | ||
.name(member.getName()) | ||
.github(member.getGithub()) | ||
.studentNumber(member.getStudentNumber()) | ||
.build(); | ||
|
||
return ResponseEntity.status(HttpStatus.OK).body(response); | ||
} | ||
|
||
/** | ||
* 멤버가 정보를 수정합니다. | ||
* | ||
* @param memberId 멤버를 조회할 정보 | ||
* @param request 수정할 정보 | ||
* @return 성공하면 성공 메시지 204 반환 | ||
*/ | ||
@PatchMapping("/{id}/profile") | ||
public ResponseEntity<String> updateMemberProfile( | ||
@PathVariable("id") Long memberId, | ||
@RequestBody MemberUpdateRequestDto request | ||
// @RequestHeader("Authorization") String authorizationHeader | ||
) { | ||
// // Bearer 토큰 추출 | ||
// String token = authorizationHeader.replace("Bearer ", ""); | ||
// | ||
// // TODO: JWT 토큰 검증 로직 추가 | ||
|
||
memberService.updateMember(memberId, request); | ||
|
||
return ResponseEntity.status(HttpStatus.NO_CONTENT).body("프로필 수정 성공"); | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. body 에 메세지를 적지않아도 충분해보이옵니다 |
||
} | ||
} |
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -9,8 +9,14 @@ | |
import jakarta.persistence.OneToMany; | ||
import java.util.ArrayList; | ||
import java.util.List; | ||
import lombok.*; | ||
|
||
@Entity | ||
@Builder | ||
@ToString | ||
@NoArgsConstructor | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. noArg 에는 protected(JPA 명세서가 private 는 허용하지 않습니다) 로 제한하여 |
||
@AllArgsConstructor(access = AccessLevel.PRIVATE) | ||
@Getter | ||
public class Member { | ||
@Id | ||
@GeneratedValue(strategy = GenerationType.IDENTITY) | ||
|
@@ -25,4 +31,16 @@ public class Member { | |
private String name; | ||
private String github; | ||
private String studentNumber; | ||
|
||
public void updateMember(String name, String github, String studentNumber) { | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. null 검사는 서비스 단계에서 발생가능한 부분을 Optional 로 감싸서 |
||
if (name != null) { | ||
this.name = name; | ||
} | ||
if (github != null) { | ||
this.github = github; | ||
} | ||
if (studentNumber != null) { | ||
this.studentNumber = studentNumber; | ||
} | ||
} | ||
} |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,10 @@ | ||
package com.gdgoc.study_group.member.dto.request; | ||
|
||
import lombok.Getter; | ||
|
||
@Getter | ||
public class MemberCreateRequestDto { | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. record 사용을 권장드리옵니다 |
||
private String name; | ||
private String github; | ||
private String studentNumber; | ||
} |
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. e379980#r1923096926 와 같사옵니다 |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,10 @@ | ||
package com.gdgoc.study_group.member.dto.request; | ||
|
||
import lombok.Getter; | ||
|
||
@Getter | ||
public class MemberUpdateRequestDto { | ||
private String name; | ||
private String github; | ||
private String studentNumber; | ||
} |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,10 @@ | ||
package com.gdgoc.study_group.member.dto.response; | ||
|
||
import lombok.Builder; | ||
import lombok.Getter; | ||
|
||
@Getter | ||
@Builder | ||
public class MemberCreateResponseDto { | ||
private String studentId; | ||
} |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,13 @@ | ||
package com.gdgoc.study_group.member.dto.response; | ||
|
||
import lombok.Builder; | ||
import lombok.Getter; | ||
|
||
@Getter | ||
@Builder | ||
public class MemberGetResponseDto { | ||
private String studentId; | ||
private String name; | ||
private String github; | ||
private String studentNumber; | ||
} |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
class 에 transactional readOnly 걸고, write 하는 메소드만 다시 어노테이션 거는게 어떠하옵니까