-
[스프링부트 및 JPA] - 사용자 모델 만들기 본문

로그인 인풋입니다.
우리는 회원가입할 때 아주 간단히, username, password, email, name 이렇게 4가지 요소만 받아서 사용자 모델을 만들어 볼 것입니다.
우선 저는 web 패키지 내부에 dto.auth라는 패키지를 또 따로 생성하여 SignupDto라는 클래스를 만들었습니다.
DTO는 Data Transform Object의 약자로서 통신할 때 필요한 데이터를 담아두는 오브젝트입니다.
여기에 우리는 4가지의 데이터를 담아야겠죠? (username, pw, email, name)
그래서 적어봅시다.

이렇게 적는데, Dto클래스는 위에 @Data라는 어노테이션을 걸면 좋습니다.
저걸 걸게되면 따로 Getter, Setter를 오버라이딩 안해도 되기 때문에 (롬복 라이브러리에 의해) 상당히 편리합니다.
그 다음에 AuthController로 갑니다.
Form으로 데이터를 받아오면 key = value형식으로 전달할 수 있는데요. (x - www-form-urlencoded방식)
파라미터에

이렇게 SignupDto signupDto를 파라미터로 받아줍니다.
그리고 이렇게 받아온 데이터들을 DB에 Insert해야겠죠?
이를 위해선 User 모델이 필요합니다.
자 그래서 어떻게 하냐면 패키지를 하나 만드는데
domain 폴더의 user라는 패키지에 User라는 클래스를 만듭니다.

굳이 user라는 패키지를 만드는 이유는 domain에 user라는 domain만 들어가면 안되기 때문이에요. 이외에도 board라는 domain이 들어갈 수도 있고 comment라는 도메인이 들어갈 수도 있어서 최대한 안겹치게 하기 위해서 domain이라는 패키지를 따로 생성 후 그 내부에 한 번 더 분리를 시키기 위해 user라는 domain을 만든 것입니다.
드디어 JPA개념이 여기서부터 등장합니다.
JPA는 Java Persistence API의 약자입니다.
쉽게 말해 자바로 데이터를 영구적으로 저장할 수 있는 API를 제공할 수 있게합니다.
바로 DB에 말이죠.

이런식으로 모두 선언할 건데, website 부터 gender 저부분은 필수로 기입할 부분이 아니여서 나중에 수정할 수 있게 할 것입니다.
중요한 것은 이 User라는 하나의 모델은 이러한 정보를 가지고 있게 만들 것이기 때문에 하나의 유저는 하나의 속성을 가지게끔 원자성을 띄게 할 것이며 DB에도 삽입할 것입니다.
또한 private LocalDateTime의 createDate를 선언했는데 이 createDate는 @Prepersist 어노테이션을 걸었습니다.
DB에 데이터가 Insert 되기 직전에 실행된다는 뜻입니다.
따라서 createDate()는 LocalDateTime.now()라고 선언하여 이것을 DB가 Insert되기 전에 실행하여 생성 시간을 DB에 같이 담을 것입니다.
자 그다음

이것도 같이 입력하여 프로필 사진과 권한도 줘보겠습니다.

그리고 어노테이션을 총 4개를 겁니다.
@Entity를 걸면 DB에 테이블을 생성할 수 있게 도와줍니다.
@Data는 이 데이터들을 getter, setter로 오버라이딩 할 수 있게 해주고
@NoArgsConstructor와 @AllAgrsConstructor는
AllArgsConstructor : An all-args constructor requires one argument for every field in the class.
NoArgsConstructor : Will generate an error message if such a constructor cannot be written due to the existence of final fields
자 공식 문서에 나와 있는 내용입니다.
AllArgsConstructor는 모든 요소들은 하나의 속성에 하나의 값을 필요로 한다는 것을 의미하고(원자성)
NoArgsConstructor는 요소가 없어도 테이블을 만들 수 있으며 어떤 이유로 생성자를 쓸 수 없는 경우 오류를 생성합니다.
그래서 우리는 회원가입할 때 이렇게나 많은 정보들을 모두 받아들일 필요가 없기 때문에 NoArgs와 AllArgs를 어노테이션으로 걸어줍니다.
자 그리고 마지막으로 PK를 설정합시다.

이렇게 id위에 @Id라고 어노테이션을 겁니다.
PK는 음... Primary Key의 약자라고 보시면 됩니다.
모든 데이터베이스 테이블에는 각자 고유의 PK가 존재합니다.
이 PK는 어떤 다른 속성과도 차별되며 그 테이블에서 해당 PK만 가지는 고유의 성격이라고 보시면 됩니다.
예를 들어 도서관 시스템을 개발하려고 할 때 학생 이름, 학번, 전화번호, 나이 중에 어떤 것이 PK일까요?
바로 학번 또는 전화번호가 되겠습니다.
왜냐하면 이름이나 나이는 동명이인이 있어서 다른 사람과 겹칠 수가 있습니다.
하지만 학번과 전화번호는 겹칠일이 없지요.
그러나 제가 개발자라면 학번으로 PK를 설정할 것입니다.
왜냐하면 전화번호도 고유한 Key값이 될 수 있지만 만약 null로 입력될 수도 있기 때문입니다.
이해되셨나요?
이렇게 다 작성하고 Pk값을 좀 더 설정할 건데 이렇게 입력해봅시다.

이렇게 입력하면 번호 증가 전략을 세울 수 있는데, DB의 id증가 전략을 그대로 따라갑니다.
저는 오름차순으로 증가하게끔 할 것입니다.
저는 MariaDB를 사용하는데 이걸 실제 DB에 어떻게 생성되어있는지 보겠습니다.

id값을 PK로 하니 열쇠모양이 있죠?
완성된겁니다.
이렇게 만드는 작업을 ORM이라고 합니다.
이 오브젝트를 만들면 테이블이 만들어진다는 것을 의미합니다.
자 여기서 꼭 까먹지 말아야할 것이 있는데, application.yml파일에서 ddl-auto를 create로 바꾸어 놓고 실행한 뒤 update로 리로드 해야합니다.
자 그럼 최종적으로 완성되었네요!
감사합니다.
'백엔드 기술 정리 > 스프링 부트' 카테고리의 다른 글
[스프링부트 및 JPA] - BCryptPasswordEncoder를 이용한 비밀번호 해시화 (0) | 2022.02.05 |
---|---|
[스프링부트 및 JPA] - @RequiredArgsContructor과 @Autowired를 이용한 DI (0) | 2022.02.04 |
[스프링부트 및 JPA] - Security Configuration과 CSRF토큰 (0) | 2022.01.28 |
[스프링부트 및 JPA] - Http 요청 재분배하기 (Redircetion) (0) | 2022.01.28 |
[스프링부트 및 JPA] - 주소변수 매핑, Http 요청을 file로 응답하기 (2) | 2022.01.27 |