Skip to content
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

Merged
merged 13 commits into from
Jan 22, 2025
Merged
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

class 에 transactional readOnly 걸고, write 하는 메소드만 다시 어노테이션 거는게 어떠하옵니까

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) {
Copy link
Collaborator

@cmj7271 cmj7271 Jan 21, 2025

Choose a reason for hiding this comment

The 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("프로필 수정 성공");
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

body 에 메세지를 적지않아도 충분해보이옵니다
그리고, 204 No Content 는 찾아보니 Res Body 가 없는 Res 라고 한다하옵니다
따라서 이대로면 body 가 없는게 맞는거 같습니다요
데이터가 업데이트 된 것이니 새로 리셋하라는 의미에서
205 Reset Content 가 더 적절해보이옵니다

}
}
18 changes: 18 additions & 0 deletions src/main/java/com/gdgoc/study_group/member/domain/Member.java
Original file line number Diff line number Diff line change
Expand Up @@ -9,8 +9,14 @@
import jakarta.persistence.OneToMany;
import java.util.ArrayList;
import java.util.List;
import lombok.*;

@Entity
@Builder
@ToString
@NoArgsConstructor
Copy link
Collaborator

@cmj7271 cmj7271 Jan 21, 2025

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

noArg 에는 protected(JPA 명세서가 private 는 허용하지 않습니다) 로 제한하여
builder 로만 만들도록 조정하는 것이 어떠하옵니까

@AllArgsConstructor(access = AccessLevel.PRIVATE)
@Getter
public class Member {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
Expand All @@ -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) {
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

null 검사는 서비스 단계에서 발생가능한 부분을 Optional 로 감싸서
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 {
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

record 사용을 권장드리옵니다

private String name;
private String github;
private String studentNumber;
}
Copy link
Collaborator

Choose a reason for hiding this comment

The 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;
}
Loading