Contents
UserModel 만들기
   Sep 18, 2022     5 min read

User 모델 만들기

username, password, email, name의 데이터를 받을 수 있는 DTO(Data Transfer Object)를 만들어보자.

└─📁COME.COS.photogram
   
   └─📁web
       
       └─ 📁dto
            
            └─📁auth
            
            └─ 📦 SignupDto.java

생성

package : dto, auth

class : SignupDto.java(Requset DTO)

dto 요청, 응답이 있다.

  • 요청 (데이터베이스에게)
  • 응답
@Date
public class SignupDto{
	private String username;
	private String password;
	private String email;
	private String name;
}

@Data : Getter와 Setter를 만들어주는 애너테이션 (Lombok에 있는 애너테이션)

  • AuthController에 signup(SignupDto signupDto)에 추가

SignupDto signupDto 는 form태그에서 입력된 값이 받아온다.

@Controller
public class AuthController {

		@PostMapping("/auth/signup")
		public String signup(SignupDto signupDto){
		return "auth/signup";
		}
}

form(태그)으로 데이터가 오면 데이터 형식(Key = value (x-www-form-urlencoded) )

Spring은 기본적으로 x-www-form-urlencoded 방식으로 데이터를 받아준다.

  • 로그를 찍어서 데이터를 잘 받았는지 확인해보자 !
@Controller
public class AuthController {
		private static final logger log = LoggerFactory.getLogger(AuthController.class);

		@PostMapping("/auth/signup")
		public String signup(SignupDto signupDto){
			log.info(signupDto.toString());
			return "auth/signup";
		}
}
  • 로그를 찍어낸 결과 데이터를 잘 받아온다.

Untitled

자 ! 다음 step 받은 데이터들을 데이터베이스에 insert 해준다.

How ?

우선 모델이 필요 → User 모델

└─📁COME.COS.photogram
   
   └─📁domain
       
       └─📁user
			   
			   └─📦 User.java
  • 생성

package : domain, user

class : User.java

//JPA : Java Persistence API(자바로 데이터를 영구적으로 저장(DB에)할 수 있는 API를 제공)
@AllArgsConstructor // 전체 생성자
@NoargsConstructor //빈 생성자
@Data // Getter/Setter
@Entity //DB에 테이블을 생성해준다.
public class User{
		private int id;   // Long id

		private String username;
		private String password;

		private String name; // 이름
		private String website;  // 웹사이트
		private String bio; // 자기 소개
		private String email;
		private String phone;
		private String gender;

		private String profileimageUrl; // 훗날 작성자의 사진이될 변수
		private String role; //권한

		//데이터베이스에게 데이터가 언제 들어 왔는지 항상 필요하다.
		private LocalDateTime createDate; // 데이터가 언제 들어왔는지 데이터베이스는 필요하다 !

		@PrePersist // createDate()가 데이터베이스에 insert되기 직전에 PrePersist가 실행
		public void createDate(){
			this.createDate = LocalDateTime.now();
		}
}

실제 서비스를 한다면 Long으로 하는게 좋긴하다. 하지만 여기선 미니프로젝트이니 int로 하겠다.

정수형 타입할당되는 메모리의 크기데이터의 표현 범위
byte1바이트-128 ~ 127
short2바이트-215 ~ (215 - 1)
  -32,768 ~ 32,767
int4바이트-231 ~ (231 - 1)
  -2,147,483,648 ~ 2,147,483,647
long8바이트-263 ~ (263 - 1)
  -9,223,372,036,854,775,808 ~ 9,223,372,036,854,775,807
  • 데이터베이스에 값을 넣어줄 때, 위에 데이터(username, password, name, website, bio, email, phone, gender)를 넣어주면 createDate()는 자동으로 들어간다.

createDate()는 데이터를 넣은 시간을 나타낸다.

		@PrePersist // createDate()가 데이터베이스에 insert되기 직전에 PrePersist가 실행
		public void createDate(){
			this.createDate = LocalDateTime.now();
		}
  • @Entity : DB에 테이블을 생성해준다.
  • @Data : Getter/Setter 생성
  • @NoargsConstructor :빈 생성자
  • @AllArgsConstructor :전체 생성자
@AllArgsConstructor // 전체 생성자
@NoargsConstructor //빈 생성자
@Data // Getter/Setter 생성
@Entity //디비에 테이블을 생성해준다.
public class User{
}

어플리케이션 실행 ! 하지만 실패 …

why? Error Primary key가 없어서 오류나는 것이다. → Entity에 대한 식별(identifier)이 없다.

오류 메시지 - No identifier specified for entity : com.cos.photogram.domain.user.User

@NoargsConstructor //빈 생성자
@Data // Getter/Setter
@Entity //디비에 테이블을 생성해준다.
public class User{

		@Id
		@GeneratedValue(strategy = GenerationType.IDENTITY) // 번호 증가 전략이 데이터베이스를 따라간다.
		private int id;   // primary key

		private String username;
		private String password;

		private String name; // 이름
		private String website;  // 웹사이트
		private String bio; // 자기 소개
		private String email;
		private String phone;
		private String gender;

		private String profileimageUrl; // 훗날 작성자의 사진이될 변수
		private String role; //권한

		//데이터베이스에게 데이터가 언제 들어 왔는지 항상 필요하다.
		private LocalDateTime createDate; // 데이터가 언제 들어왔는지 데이터베이스는 필요하다 !

		@PrePersist // createDate()가 데이터베이스에 insert되기 직전에 PrePersist가 실행
		public void createDate(){
			this.createDate = LocalDateTime.now();
		}
}

추가

@GeneratedValue(strategy = GenerationType.IDENTITY)

  • 번호 증가 전략(strategy = GenerationType.IDENTITY)이 데이터베이스를 따라간다.
    • mysql, mariadb- Auto Increment을 쓴다.
    • Oracle - SequenceGenerator을 쓴다.

데이터베이스에 접속한다.

Untitled 1

Untitled 2

이런 식으로 테이블이 만들어진다. 객체를 테이블로 만들어 ?!!! 이게 ORM의 세계 ?!!!

대박..

tumblr_mijuioESRS1qg6rkio1_500

application.yml 안에 JPA → ddl-auto의 역할은?

ddl-auto

  • update : 데이터를 insert하고 나서 서버를 다시 실행해도 유지되어 남아있게 해준다.
  • create : 데이터를 insert하고 나서 서버를 재실행하면 insert했던 데이터가 다 사라진다.
jpa:
open-in-view:true
  hibernate:
ddl-auto: create
naming:
physical-strategy: org.hibernate.boot.model.naming.PhysicalNamingStrategyStandardImpl
show-sql:true

UserModel 글을 쓴 회고

UserModel을 직접 만들고 JPA를 쓰니깐.. 와 정말 편하다. 점점 툴이 극적인 기능을 갖고 나타날 것같다. 이미 나온 것만 봐도.. 입이 다물어지지 않는다. 대박이다..