이 글은 Spring Boot를 공부하며 정리한 글입니다.
어플리케이션은 대부분 로그인 인증을 많이 이용합니다. 로그인을 위해서는 기본적으로 회원가입을 해야하는데요. 이번글에서는 MySQL과 JPA를 이용해서 회원가입 기능을 만들어보겠습니다.
회원정보를 전달하기 위한 Entity는 아래와 같습니다.
@Entity
@Table(
uniqueConstraints = [UniqueConstraint(name = "uk_member_login_id", columnNames = ["loginId"])]
)
class Member(
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
var id : Long?,
@Column(nullable = false, length = 30, updatable = false)
val loginId : String,
@Column(nullable = false, length = 100,)
val password : String,
@Column(nullable = false, length = 10,)
val name : String,
@Column(nullable = false,)
@Temporal(TemporalType.DATE)
val birthDate : LocalDate,
@Column(nullable = false, length = 5,)
@Enumerated(EnumType.STRING)
val gender : Gender,
@Column(nullable = false, length = 30)
val email : String,
)
여기서, 회원정보 중 loginId를 통해서 유니크키를 생성해주었습니다. 해당 정보는 유니크키여야 하므로, 업데이트는 불가능하도록 설정되었습니다.
마찬가지로 데이터를 직접 전달받는 것보다는 DTO를 이용해서 전달받겠습니다.
data class MemberRequestDto(
val id : Long?,
val loginId : String,
val password : String,
val name : String,
val birthDate : LocalDate,
val gender: Gender,
val email : String,
)
fun MemberRequestDto.toEntity() = Member(
id = id,
loginId = loginId,
password = password,
name = name,
birthDate = birthDate,
gender = gender,
email = email,
)
이번에는 JpaRepository를 이용해서 Repository를 정의하겠습니다. JpaRepository는 CrudRepository와 다르게 CRUD 외에 다른 기능들도 제공해줍니다.
interface MemberRepository : JpaRepository<Member, Long> {
fun findByLoginId(loginId : String) : Member?
}
다만, 이번에는 회원가입 기능 중 ID 중복체크를 위해서 findByLoginId라는 메소드를 정의하겠습니다.
Service는 실질적인 비즈니스 로직입니다. 회원가입을 위해서는 기본적으로 회원 ID가 이미 등록되었는지 확인할 필요가 있습니다. 회원가입이 되어있다면, null이 아닌 값이 반환되어 회원가입 여부에 따라서 다른 로직을 실행시킵니다.
@Transactional
@Service
class MemberService(
private val memberRepository: MemberRepository
) {
// 회원가입
fun signUp(memberRequestDto : MemberRequestDto) : String {
// ID 중복체크
var member: Member? = memberRepository.findByLoginId(memberRequestDto.loginId)
if (member != null) {
return "이미 등록된 ID입니다."
} else {
memberRepository.save(memberRequestDto.toEntity())
return "회원가입이 완료되었습니다."
}
}
}
여기서는 트랜잭션을 적용하기 위해 @Transactional이 사용되었습니다.
Controller에서 해당 api에 대한 경로를 Mapping해줍니다. 물론 이 모든과정에서 데이터는 RequestDto를 이용해서 전달받습니다.
@RestController
@RequestMapping("/api/member")
class MemberController(
private val memberService : MemberService
) {
// 회원가입 api
@PostMapping("/signup")
fun signUp(@RequestBody memberRequestDto: MemberRequestDto) : String
= memberService.signUp(memberRequestDto)
}
이로써, MySQL, JPA를 이용한 회원가입 기능 구현이 완료되었습니다.