스프링과 JPA 기반 웹 애플리케이션 개발 #7 계정 도메인

Jake Seo·2021년 5월 25일
0

스프링과 JPA 기반 웹 애플리케이션 개발 #7 계정 도메인

해당 내용은 인프런, 스프링과 JPA 기반 웹 애플리케이션 개발의 강의 내용을 바탕으로 작성된 내용입니다.

강의를 학습하며 요약한 내용을 출처를 표기하고 블로깅 또는 문서로 공개하는 것을 허용합니다 라는 원칙 하에 요약 내용을 공개합니다. 출처는 위에 언급되어있듯, 인프런, 스프링과 JPA 기반 웹 애플리케이션 개발입니다.

제가 학습한 소스코드는 https://github.com/n00nietzsche/jakestudy_webapp 에 지속적으로 업로드 됩니다. 매 커밋 메세지에 강의의 어디 부분까지 진행됐는지 기록해놓겠습니다.


Account 도메인

도메인에 들어갈 기능

  • 로그인
  • 프로필
  • 알람 설정

도메인 생성하기

현재 개발 환경은 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 예제

@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()라는 메소드를 먼저 호출하여 메소드 체인 형식으로 객체를 생성하는 것이다.

공식 문서에 친절히 설명되어 있다.

profile
풀스택 웹개발자로 일하고 있는 Jake Seo입니다. 주로 Jake Seo라는 닉네임을 많이 씁니다. 프론트엔드: Javascript, React 백엔드: Spring Framework에 관심이 있습니다.

0개의 댓글