스프링과 JPA 기반 웹 애플리케이션 개발 #7 계정 도메인
해당 내용은 인프런, 스프링과 JPA 기반 웹 애플리케이션 개발의 강의 내용을 바탕으로 작성된 내용입니다.
강의를 학습하며 요약한 내용을 출처를 표기하고 블로깅 또는 문서로 공개하는 것을 허용합니다 라는 원칙 하에 요약 내용을 공개합니다. 출처는 위에 언급되어있듯, 인프런, 스프링과 JPA 기반 웹 애플리케이션 개발입니다.
제가 학습한 소스코드는 https://github.com/n00nietzsche/jakestudy_webapp 에 지속적으로 업로드 됩니다. 매 커밋 메세지에 강의의 어디 부분까지 진행됐는지 기록해놓겠습니다.
현재 개발 환경은 1인이며, 간단한 시스템을 개발할 것이기 때문에 Monolithic 하게 진행하며 MSA 등을 위한 모듈화는 크게 고려하지 않는다.
package com.jakestudy.domain;
import lombok.*;
import javax.persistence.*;
import java.time.LocalDateTime;
@Entity
@Getter @Setter @EqualsAndHashCode(of = "id") // 무한루프에 빠지지 않게 하도록 하기 위해
@Builder @AllArgsConstructor @NoArgsConstructor
public class Account {
// 기본 스트링은 varchar(255)로 입력됨
// 사용자의 기본 정보에 대한 컬럼들
@Id @GeneratedValue
private Long id;
@Column(unique = true)
private String email;
@Column(unique = true)
private String nickname;
private String password;
private boolean emailVerified;
private String emailCheckToken;
private LocalDateTime joinedAt;
private String bio;
private String url;
private String occupation;
private String location;
// 프로필의 이미지는 매우 커질 수 있음
// 프로필 이미지가 자주 같이 쓰일 것이라 EAGER로 가져왔다.
@Lob @Basic(fetch = FetchType.EAGER)
private String profileImage;
// 스터디에 대한 알람을 어떻게 받을지에 대한 컬럼
private boolean studyCreatedByEmail;
private boolean studyCreatedByWeb;
private boolean studyEnrollmentResultByEmail;
private boolean studyEnrollmentResultByWeb;
private boolean studyUpdatedByEmail;
private boolean studyUpdatedByWeb;
}
위와 같이 생성해주었다. 많은 코드가 Lombok
에 의해 자동화되었다.
@Builder
애노테이션은 Builder 와 같은 패턴으로 객체를 생성할 수 있는 기능을 말한다.
@EqualsAndHashCode
애노테이션에는 of
엘리먼트의 값을 "id"
하나로 정해주어야 순환참조 문제에 빠져 무한루프가 일어나지 않도록 예방이 된다.
@Builder
public class BuilderExample {
private Integer foo;
private final String bar;
}
위와 같은 클래스가 있을 때,
public class BuilderExampleTest {
public static void main(String[] args) {
BuilderExample builderExample1 = new BuilderExample(10, "test");
BuilderExample builderExample2 = BuilderExample.builder().foo(10).bar("test").build();
}
}
이렇게 생성의 방식을 new
키워드로 생성자를 쓰는 것이 아니라, .builder()
라는 메소드를 먼저 호출하여 메소드 체인 형식으로 객체를 생성하는 것이다.
공식 문서에 친절히 설명되어 있다.