ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 1. [TodoList] - 도메인 설계
    AppCenter/TodoList 2023. 5. 15. 23:51
    반응형

    앱센터 프로젝트로 만들게 된 TodoList API 

     

    간단한 프로젝트지만 여러가지 기술을 사용해 볼 수 있는 좋은 기회니 하나하나 정리해보자.

     

     

     

    프로젝트 내용

    User, Todo CRUD  API 구축

     

    사용 기술

    1. Spring JPA

    2. Spring Security + JWT

    3. MySQL

     

     

    시작하기에 앞서 User 와 Todo ERD를 설계해보았다. 

    처음 설계해보는 ERD 라 어떻게 설계할지 고민이 많았는데 마침 ERD 클라우드 라는 좋은 설계 사이트가 있어서 쉽게 만들 수 있었다.

     

    https://www.erdcloud.com/

     

     

     

    User 클래스

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    @Entity
    @Getter
    @NoArgsConstructor(access = AccessLevel.PROTECTED)
    public class User {
     
        @Id
        @GeneratedValue
        private Long id;
     
        @Column(nullable = false,length = 20)
        private String name;
     
        @Column(nullable = falselength = 20)
        private String password;
     
        @Column(nullable = false)
        private String email;
     
        @OneToMany(mappedBy = "user")
        private List<Task> taskList = new ArrayList<>();
     
        @Builder
        public User(String name, String password, String email) {                                
            this.name = name;
            this.password = password;
            this.email = email;
        }
    }
    cs

     

     

    @NoArgsConstructor 의 엑세스 레벨을 PROTECTED로 설정했다. 

     

    이렇게 할 경우 무분별한 객체 생성을 막아 객체 생성 전 한번 더 체크할 수 있게 한다.

     

    예를들어 위의 User 클래스를 생성할 때 

    User user = new User();
    
    user.setpassword("hello")
    user.setemail("dudqk9696@naver.com")

    위와같이 생성하게 되면 name 필드가 생성되지 않아 불완전한 객체가 된다.

    이를 방지하기 위해 NoArgsConstructor 의 엑세스레벨을 PROTECTED 로 설정했다.

     

     

    Task 클래스

     

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    @Entity
    @Getter
    @NoArgsConstructor(access = AccessLevel.PROTECTED)
    @AllArgsConstructor
    public class Task {
     
        @Id @GeneratedValue
        private Long id;
     
        @Column(nullable = falselength = 20)
        private String title;
        private String contents;
     
        @Column(nullable = false)
        private Boolean isCompleted;
     
        @Column(nullable = false)
        private LocalDateTime deadline;
     
        @ManyToOne(fetch = FetchType.LAZY)
        @JoinColumn(name = "user_id")
        private User user;
     
        @Builder
        public Task(Long id, String title, String contents, Boolean isCompleted, User user, LocalDateTime deadline) {
            this.id = id;
            this.title = title;
            this.contents = contents;
            this.isCompleted = isCompleted;
            this.user = user;
            this.deadline = deadline;
        }
     
        public void setContents(String contents) {
            this.contents = contents;
        }
     
        public void setTitle(String title) {
            this.title = title;
        }
     
        public void setDeadline(LocalDateTime parseDatetime) {
            this.deadline = parseDatetime;
        }
    }
    cs

     

    User 한명은 여러가지의 Task 를 가질 수 있기 때문에 위의 ERD에서 봤듯 User와 Task를 일대다 관계로 두었고, Task 는 연관된 User 데이터를 가져오기 위해 외래키를 가진다.

     

     

    도메인에서는 더 알아야할것이 없어 Service & Repository 에 대한 설명으로 넘어가자

    728x90
    반응형

    댓글

Designed by Tistory.