본문 바로가기
그룹스터디

프로젝트 준비 1 - JPA, ResponseEntity를 활용하여 회원가입 연습하기

by 민초닷컴 2023. 1. 19.

토큰 방식의 회원가입, 로그인을 연습하기 위해 JWT, Spring Security를 사용하고, ResponseEntity를 활용하여 Http 상태 코드 설정을 경험해보기로 했다.

※ API 서버 개발 연습을 위해 뷰 페이지 없이 POSTMAN을 활용했다.

    implementation 'org.springframework.boot:spring-boot-starter-web'
    annotationProcessor('org.projectlombok:lombok')
    testAnnotationProcessor('org.projectlombok:lombok')
    runtimeOnly 'com.mysql:mysql-connector-j'
    testImplementation 'org.springframework.boot:spring-boot-starter-test'

    // https://mvnrepository.com/artifact/io.jsonwebtoken/jjwt
    implementation 'io.jsonwebtoken:jjwt:0.9.1'
    implementation 'org.springframework.boot:spring-boot-starter-security'
    implementation 'org.springframework.boot:spring-boot-starter-data-jpa'
    implementation 'org.springframework.boot:spring-boot-starter-validation'

lombok, mysql, jjwt, security, jpa, validation을 사용하기 위해 종속성을 추가한다.

@Getter
@Builder
@NoArgsConstructor
@AllArgsConstructor
@Table(name = "member")
@Entity
@ToString
public class Account {
    @Id
    @Column(name = "user_id")
    private String userId;

    @Column(name = "user_pw")
    private String userPw;

    @Column(name = "username")
    private String username;

    @Column(name = "nickname")
    private String nickname;

    @Column(name = "role")
    private String role;
}

지금은 간단한 예제를 사용하기 위해 테이블 컬럼을 단순하게 설정했다. 이제 실습을 해볼까하는데 우선 토큰 및 security 설정이 크게 필요없는 회원가입부터 시작해보자.

 

1. DTO(SignupRequest) 만들기

@Getter
@Setter
@NoArgsConstructor
@AllArgsConstructor
@ToString
public class SignupRequest {

    private String userId;
    private String userPw;
    private String username;
    private String nickname;
    private String role;

    public Account toEntity() {
        return Account.builder()
                .userId(this.userId)
                .userPw(this.userPw)
                .username(this.username)
                .nickname(this.nickname)
                .role(this.role)
                .build();
    }


}

회원가입 시 전달 받을 값들을 필드로 지정하고 Account 테이블에 insert 하기 위해서 toEntity() 메서드를 설정해준다.

 

2. repository 설정

public interface LoginRepository extends JpaRepository<Account, String> {
    Optional<Account> findByUserId(String userId);
}

JpaRepository를 설정해주고 userId를 통해 select 하는 메서드를 추가해준다.

 

3. service 설정

public class LoginService {

    private final LoginRepository lr;
    private final PasswordEncoder passwordEncoder;
    
    public String signup(SignupRequest req) {
        if (lr.findByUserId(req.getUserId()).orElse(null) != null) { // 회원 테이블을 userId 기준으로 select 해서 나온 값이 있으면 "failed"
            return "failed";
        }
        String encodingPassword = encodingPassword(req.getUserPw());
        req.setUserPw(encodingPassword);
        lr.save(req.toEntity());
        return "success";
    }

    private String encodingPassword(String pw) {
        return passwordEncoder.encode(pw);
    }
}
  • encodingPassword 메서드는 클라이언트에게 전달 받은 password를 암호화한다.
  • signup 메서드에서 현재 테이블에 userId가 중복으로 되어 있으면 "failed"를 반환하기로 했고, 그 외에는 중복 체크를 하지 않고 "success"를 반환한다.

4. controller 설정

@PostMapping("/signup")
    public ResponseEntity<String> signup(@RequestBody SignupRequest req) {
        if (ls.signup(req).equals("success")) {
            return new ResponseEntity<>("success", HttpStatus.OK);
        } else {
            return new ResponseEntity<>("아이디 중복입니다.", HttpStatus.BAD_REQUEST);
        }
    }

ResponseEntity를 사용하여 성공했을 때는 httpStatus를 200으로 설정하고, 실패 했을 때는 400으로 설정했다.

 

5. postman 확인

userId가 중복일 경우 ReponseEntity에서 설정한 것처럼 Body에 정한 "아이디가 중복입니다"로 나타나고 Status도 400인 것을 확인할 수 있다(body에 넣은 값은 테스트를 위한 문자열이므로 프로젝트에서 값을 보낼땐 조원들과 고민해보자). 

물론 중복이 아니라면 정상 작동하여 테이블에 insert 된다.

 

간단한 회원가입은 확인했으니 다음은 JWT, Spring Security를 활용한 로그인 기능을 구현해보도록 하자.

'그룹스터디' 카테고리의 다른 글

properties vs yaml  (0) 2023.01.27
@SpringBootTest, @WebMvcTest, @DataJpaTest  (0) 2023.01.06
JPA Auditing  (0) 2022.12.30
일급 컬렉션(First Class Collection)  (0) 2022.12.23
XML Configuration vs Java Configuration  (0) 2022.12.14