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
Original file line number Diff line number Diff line change
@@ -0,0 +1,92 @@
package com.gdgoc.study_group.member.api;

import com.gdgoc.study_group.member.application.MemberService;
import com.gdgoc.study_group.member.domain.Member;
import com.gdgoc.study_group.member.dto.request.MemberRequestDto;
import com.gdgoc.study_group.member.dto.response.MemberCreateResponseDto;
import com.gdgoc.study_group.member.dto.response.MemberGetResponseDto;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.tags.Tag;
import lombok.RequiredArgsConstructor;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;

@RestController
@RequestMapping("/users")
@RequiredArgsConstructor
@Tag(name = "Member", description = "회원 API")
public class MemberController {
private final MemberService memberService;

/**
* 새 멤버를 생성합니다.
*
* @param request 새로 만들 멤버 정보
* @return 성공하면 생성 성공 메시지와 생성된 회원의 ID 반환
*/
@Operation(summary = "멤버 생성", description = "관리자가 직접 정보 넣어서 멤버 생성")
@PostMapping
public ResponseEntity<MemberCreateResponseDto> createMember(@RequestBody MemberRequestDto request) {
Member createdMember = memberService.createMember(request);

// record 생성자 직접 호출
MemberCreateResponseDto response = new MemberCreateResponseDto(createdMember.getId().toString());

return ResponseEntity.status(HttpStatus.CREATED).body(response);
}

/**
* 멤버를 조회합니다.
*
* @param memberId 멤버를 조회할 정보
* @return 성공하면 성공 메시지와 회원 정보 반환
*/
@Operation(summary = "멤버 조회", description = "url에 담긴 id 정보로 해당 회원 정보 조회")
@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);

// record 생성자 직접 호출
MemberGetResponseDto response = new MemberGetResponseDto(
member.getId().toString(),
member.getName(),
member.getGithub(),
member.getStudentNumber()
);

return ResponseEntity.status(HttpStatus.OK).body(response);
}

/**
* 멤버가 정보를 수정합니다.
*
* @param memberId 멤버를 조회할 정보
* @param request 수정할 정보
* @return 성공하면 성공 메시지 204 반환
*/
@Operation(summary = "멤버 정보 수정", description = "url에 담긴 id 정보로 해당 회원 정보 수정")
@PatchMapping("/{id}/profile")
public ResponseEntity<Void> updateMemberProfile(
@PathVariable("id") Long memberId,
@RequestBody MemberRequestDto request
// @RequestHeader("Authorization") String authorizationHeader
) {
// // Bearer 토큰 추출
// String token = authorizationHeader.replace("Bearer ", "");
//
// // TODO: JWT 토큰 검증 로직 추가

memberService.updateMember(memberId, request);

return ResponseEntity.status(HttpStatus.RESET_CONTENT).build();
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,71 @@
package com.gdgoc.study_group.member.application;

import com.gdgoc.study_group.member.dao.MemberRepository;
import com.gdgoc.study_group.member.domain.Member;
import java.util.NoSuchElementException;
import java.util.Optional;
import com.gdgoc.study_group.member.dto.request.MemberRequestDto;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

@Service
@RequiredArgsConstructor
@Transactional(readOnly = true)
public class MemberService {

private final MemberRepository memberRepository;

/**
* 새 멤버를 생성합니다.
*
* @param request 새로 만들 멤버 정보
* @return Member 형태로 반환
*/
@Transactional
public Member createMember(MemberRequestDto request) {

Member newMember =
Member.builder()
.name(request.name())
.github(request.github())
.studentNumber(request.studentNumber())
.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, MemberRequestDto request) {

Member member = getMember(memberId);

// 수정할 정보가 있을 시, dto에 담겨온 정보로 수정됨
String updatedName = Optional.ofNullable(request.name())
.orElse(member.getName());
String updatedGithub = Optional.ofNullable(request.github())
.orElse(member.getGithub());
String updatedStudentNumber = Optional.ofNullable(request.studentNumber())
.orElse(member.getStudentNumber());

member.updateMember(updatedName, updatedGithub, updatedStudentNumber);
}
}
19 changes: 19 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(access = AccessLevel.PROTECTED)
@AllArgsConstructor(access = AccessLevel.PRIVATE)
@Getter
public class Member {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
Expand All @@ -25,4 +31,17 @@ public class Member {
private String name;
private String github;
private String studentNumber;

/**
* 회원이 수정한 정보를 업데이트합니다.
* @param name 회원 이름
* @param github 회원 깃허브 주소
* @param 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 사용하는 곳에서 처리하는 것이 어떠하옵니까


this.name = name;
this.github = github;
this.studentNumber = studentNumber;
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
package com.gdgoc.study_group.member.dto.request;

public record MemberRequestDto(
String name,
String github,
String studentNumber) {}
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
package com.gdgoc.study_group.member.dto.response;

public record MemberCreateResponseDto(
String studentId) {}
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
package com.gdgoc.study_group.member.dto.response;

public record MemberGetResponseDto(
String studentId,
String name,
String github,
String studentNumber) {}
Loading