가입하는 방식은 아이디와 비밀번호, 사용자 이름을 입력하면 사용자 이름을 반환하도록 하였다.
DB에서 PK가 사용자 이름으로 되어있기 때문에 중복된 사용자는 가입을 해도 DB가 변하지 않는다,
나중에 추가적으로 오류를 발생시키는 코드를 넣고 이번에는 그냥 가입만 진행할 수 있도록 한다.
@Description("회원가입")
@PostMapping("/api/sign-up")
public ResponseEntity<ResponseJson<Object>> signUp(@RequestBody RequestSignupPostDto requestSignupPostDto){
ResponseSavedNameDto response = service.signup(requestSignupPostDto);
return ResponseEntity.ok(
ResponseJson.builder()
.status(200)
.message("OK")
.result(response)
.build()
);
}
회원가입을 진행하기 위해 사용할 컨트롤러이다.
RequsetSignupPostDto는 사용자에게 요청을 하기 위한 필드이다. Dto안에 있는 필드로 요청을 받을 수 있게 된다.
ResponseSvedNameDto는 가입한 사용자 이름을 반환하기 위한 Dto이다. Dto의 목적은 반환하는 것와 요청하는 Dto를 다르게 해야 그 의미가 있는것이라. (한가지 역할만 해야한다) Request요청을 처리하는 것과 Response요청을 처리하는 것은 나눠야 한다.
그렇게 받은 데이터를 Json의 형태로 만들어 보내기 위해 ResponseJson이라는 것을 만들어 보내도록 하였다.
public class RequestSignupPostDto {
private String email;
private String password;
private String userName;
}
public class ResponseSavedNameDto {
private String userName;
}
public class ResponseJson<T> {
Integer status;
String message;
T result;
@JsonIgnore
Object trace;
@JsonIgnore
Object path;
}
Json은 Dto는 아닌데 일단 그냥 넣어놨다.
Dto는 반드시 받을 데이터의 필드만 존재해야 하기 떄문에 타입과 필드명만 지정해주고 나머지는 쓰지 않아야 한다. Dto,Dao,VO의 구분을 확실히 해야한다.
public class signupService {
private final authRepository signInRepo;
@Description("회원 가입")
public ResponseSavedNameDto signup(RequestSignupPostDto request) {
SignUp signUp = SignUp.builder()
.emailID(request.getEmail())
.password(request.getPassword())
.userName(request.getUserName())
.build();
SignUp savedSignUp = signInRepo.save(signUp);
return ResponseSavedNameDto.builder()
.userName(savedSignUp.getUserName())
.build();
}
}
위 코드에서는 좀 빠진부분이 있는데 service라고 정의된 부분이다.
Sevice단에서는 엔티티를 이용해서 DB에 커넥션하고 데이터를 수정하는 역할을 한다.
요청으로 받은 RequsetDto를 SignUp엔티티에 적용해서 DB에 적용시킨다.
DB에 적용하는 것은 JPA를 이용하였다.
그리고 반환된 이름을 다시 ResponseDto에 넣어서 컨트롤러로 반환해준다.
@Entity
@Getter
@Builder
@AllArgsConstructor
@NoArgsConstructor
public class SignUp {
@Id
@Column(length = 20)
private String emailID;
@Column(length = 10)
private String password;
@Column(length = 10)
private String userName;
@CreatedDate
private LocalDateTime signInDate;
}
엔티티이다. 엔티티는 반드시 DB와 일치하는 컬럼을 가지고 있어야 한다. 따라서 수정 또한 자유롭게 두면 안된다.
그래서 위에 어노테이션 설정한 것을 보면 Setter가 없다는 것을 알 수 있다. 빌더를 통하지 않고 Setter로 하게되면 잘못된 데이터를 넣을 가능성이 있기 때문에 수정을 제한하는 것이다.
public interface authRepository extends JpaRepository<SignUp,Long> {
SignUp findByEmailID(String id);
}
리포지토리이다. JPA를 이용하고 있으며 JPA에 대한 것은 다른 포스트에 정리했기 때문에 넘어가겠다.
각 엔티티로 반환하는 메서드쿼리를 날리면 그에 따른 응답을 받을 수 있다.
물론 저 findByEmailID를 여기서는 사용하지 않았다 그냥 필요해서 나중에 쓸라고 추가한 것이고
SignUp savedSignUp = signInRepo.save(signUp);`
이게 회원가입을 할때 Save를 할 수 있는 기능이다.
엔티티에 정보를 담고 그걸 다시 저장된 엔티티로 반환하는 개념이다.
인텔리제이에서는 HTTP를 날려볼 수 있는 기능을 지원한다.

PostMapping을 눌러보면 이렇게 HTTP요청을 날릴 수 있는 것이 나온다.

그럼 이런식으로 POST요청을 날릴 수 있는 기능을 지원하고 HTTP의 메서드는 다 해볼 수 있다.
이 요청을 날려보면

이렇게 정상적으로 요청이 처리된 것을 볼 수 있다.
DB에서 확인해보면

정상적으로 DB에도 들어온 것을 확인할 수 있다.