일단 회원가입을 하려면 회원가입 신청 DTO가 있어야 한다.
@Data
@AllArgsConstructor
@NoArgsConstructor
public class MemberRegisterRequest{
@Email
private String email;
private String nickname;
private String password;
private Set<Role> roles;
}
- @Data가 getter와 setter까지 포함한다.
이걸 record로 선언하게 되면 타임리프의 에러 검증에서 문제가 발생한다.
아직 스프링 및 타임리프가 이런 신기능에 대응하는 업데이트를 덜 해서 그런 듯 하다. 챗지피티에 물어보니 스프링의 DataBinder가 필드 단위로 값을 주입하고 검증하기 위해서 빈 생성자 + setter를 사용하는데 record는 불변 객체라서 자바 빈 프로퍼티로 간주하지 못한다나.
프론트엔드단에서 타임리프를 안쓰거나 검증결과 출력을 안할거면 상관 없겠지만 나는 둘다 할 예정이라서 일단 class로 선언했다. 이 부분은 나중에 수정할수도 있다.
이제 회원가입 서비스를 만들어줘야 한다.
그 전에.
public interface MemberRepository extends Repository<Member, Long> {
Member save(Member member);
Member findByEmail(String email);
// 이후 Optional<Member> findByEmail(Email email);로 변경
}
리포지토리도 만들어준다.
JpaRepository가 아닌 그냥 Repository라서 save를 선언했다. 아무래도 헥사고날이 포트를 통해서 필요한 부분만 제공하는 설계다보니까 이렇게 최소 형태로 컴팩트하게 만드는 걸 추구하는 듯 하다.
일단 리포지토리를 인 포트(required port) 폴더에 넣기는 했는데 좀 더 정확하게 헥사고날에 맞춰서 하려면 어댑터 폴더로 넣고 인포트에 순수한 인터페이스를 넣는게 맞을듯.
public interface MemberRegister {
Member register(MemberRegisterRequest registerRequest);
}
회원가입 서비스를 외부로 제공해야 하기에 아웃포트(provided port)도 만들어준다.
@Service
@Transactional // 함수 중간에 에러날시 DB 원상복귀
@RequiredArgsConstructor
public class MemberService implements MemberRegister {
private final MemberRepository memberRepository;
private final PasswordEncoder passwordEncoder;
@Override
public Member register(MemberRegisterRequest registerRequest){
Member member = Member.register(registerRequest, passwordEncoder);
memberRepository.save(member);
return member;
}
}
이제 회원가입 서비스를 만들어준다.
이는 도메인 로직 자체가 들어가있는 것은 아니고 도메인을 조합하고 응용하는 단계이기에 어플리케이션 단에 들어간다.

실제 회원가입 로직 자체는 도메인 안으로 들어간다.
이제 외부의 요청을 받는 컨트롤러 부분을 만들어야 한다. 컨트롤러라는 용어 자체가 MVC 구조의 개념이라서 헥사고날에서도 그렇게 불러도 될지는 모르겠는데.
이 부분은 제일 도메인 로직에서 멀리 떨어져있고 외부 조건에 의해 변경이 쉽기 때문에 어댑터 단으로 들어간다.
@RestController
@RequiredArgsConstructor
public class MemberApi {
private final MemberRegister memberRegister;
@PostMapping("/members")
public MemberRegisterResponse register(@RequestBody MemberRegisterRequest memberRegisterRequest){
Member member = memberRegister.register(memberRegisterRequest);
return MemberRegisterResponse.of(member);
}
}
외부에서 회원가입 요청을 보내면 그걸 받는 컨트롤러다. 패러미터를 JSON으로 받고 싶어서 @RequestBody를 붙여줬다.
public record MemberRegisterResponse(Long memberId, String emailAddress) {
public static MemberRegisterResponse of(Member member) {
return new MemberRegisterResponse(member.getId(), member.getEmail());
}
}
이건 회원가입 성공시 보내는 응답DTO. 일단은 간결하게 record로 작성했다.
'스프링 부트로 블로그 서비스 개발하기' 카테고리의 다른 글
| 회원가입 기능 - 테스트 코드 작성 (0) | 2025.12.02 |
|---|---|
| 회원가입 기능 - 컨트롤러단 인풋 검증 (0) | 2025.11.27 |
| 회원가입 기능 - 스프링 시큐리티 커스텀 UserDetailsService + 도커 MySQL 적용하기 (0) | 2025.11.26 |
| 회원가입 기능 - 회원 도메인, 이메일 VO 헥사고날화 (1) | 2025.11.26 |
| 프로젝트 생성과 설정 (0) | 2025.03.13 |