JPA

[JPA] 34. RestAPI에 기반한 회원가입 기능 만들기

Song hyun 2024. 10. 23. 10:28
728x90
반응형

[JPA] 34. RestAPI에 기반한 회원가입 기능 만들기

 


*작업 순서

  1. 응답 결과 확인하기
  2. 공통 DTO 사용해 데이터 내려주기 설계
  3. 서비스 레이어 코드 수정 (레포지토리 코드 확인)
  4. 컨트롤러 레이어 코드 수정 

 


 

1. [User] 폴더에 UserResponse 클래스 만들기

package com.tenco.blog_v3.user;

import lombok.Getter;
import lombok.Setter;

public class UserResponse {

    @Getter
    @Setter
    public static class DTO{
        private int id;
        private String username;
        private String email;

        // ex: User 엔티티 반환 -> 서비스 계층에서 DTO 객체로 변환 처리
        public DTO(User user){
            this.id = user.getId();
            this.username = user.getUsername();
            this.email = user.getEmail();
        }

        // 이메일 정보를 포함하고 싶지 않다면
        public DTO(User user, Boolean includeEmail){
            this.id = user.getId();
            this.username = user.getUsername();
            if(includeEmail == true){
                this.email = user.getEmail();
            } else {
                this.email = null;
            }
        }
    }
}

 

*삼항연산자를 통해 코드를 줄일 수 있다!

// 이메일 정보를 포함하고 싶지 않다면
        public DTO(User user, Boolean includeEmail){
            this.id = user.getId();
            this.username = user.getUsername();
            this.email = includeEmail ? user.getEmail() : null;
        }

 

 

2. UserDTO - 이름 수정

*UserDTO을 UserRequest로 이름 수정(리팩터링)

 

 

3. UserController 리팩터링

(1) 회원가입 메서드

    /**
     * 회원 가입 기능 요청
     * @param reqDTO
     * @return
     */
    @ResponseBody
    @PostMapping("/join")
    public ResponseEntity<ApiUtil<UserResponse.DTO>> join(@RequestBody UserRequest.JoinDTO reqDTO) {
        // 회원가입 서비스는 서비스 객체에게 위임한다.
        userService.signUp(reqDTO);

        return ResponseEntity.ok(new ApiUtil<>(null));
    }

 

 

(2) 서비스 & 레포지토리 검토 

 

  • Service 메서드에서 에러 발생 시, Exception을 호출하게 된다.

 

4. UserResponse를 사용해 메서드 리팩터링

 

-Service -> signUp() 메서드

    /**
     * 회원 가입 서비스
     */
    @Transactional
    public UserResponse.DTO signUp(UserRequest.JoinDTO reqDto ) {
        // 1. username <-- 유니크 확인
        Optional<User> userOp = userJPARepository.findByUsername(reqDto.getUsername());

        if(userOp.isPresent()) {
            throw new Exception400("중복된 유저네임입니다");
        }

        // 회원 가입
        User savedUser = userJPARepository.save(reqDto.toEntity());

        // 컨트롤러 -> DTO 반환 처리
        return new UserResponse.DTO(savedUser);
    }

 

-Controller -> join() 메서드

    /**
     * 회원 가입 기능 요청
     * @param reqDTO
     * @return
     */
    @ResponseBody
    @PostMapping("/join")
    public ResponseEntity<ApiUtil<UserResponse.DTO>> join(@RequestBody UserRequest.JoinDTO reqDTO) {
        // 회원가입 서비스는 서비스 객체에게 위임한다.
        UserResponse.DTO resDTO = userService.signUp(reqDTO);

        return ResponseEntity.ok(new ApiUtil<>(resDTO));
    }

 

 

5. Postman으로 요청 해보기

728x90
반응형