Search

17. 스프링부트 포토그램 인증 회원가입 User 모델 만들기

포토그램 인증 구현하기

회원가입 구현

username, password, email, name 을 받을 수 있는 Data Transfer Object를 만들거다
dto 폴더 생성
auth폴더 생성
SignupDto.java 생성 (요청하는 dto생성)
DTO는 데이터 트랜스 오브젝트로 통신할때 필요한 데이터를 담아주는 오브젝트.
SignupDto.java
package com.cos.photogramstart.web.dto.auth; import lombok.Data; @Data //Getter, Setter public class SignupDto { private String username; private String password; private String email; private String name; }
Java
복사
AuthController.java
package com.cos.photogramstart.web; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PostMapping; import com.cos.photogramstart.web.dto.auth.SignupDto; @Controller // 1. IoC 등록 2. 파일을 리턴하는 컨트롤 public class AuthController { private static final Logger log = LoggerFactory.getLogger(AuthController.class); @GetMapping("/auth/signin") public String signinForm() { return "auth/signin"; } @GetMapping("/auth/signup") public String signupForm() { return "auth/signup"; } //회원가입버튼 -> /auth/signup/ -> /auth/signin @PostMapping("/auth/signup") public String signup(SignupDto signupDto) { //key=value (x-www-form-urlencoded) log.info(signupDto.toString()); return "auth/signin"; } }
Java
복사
logger 추가와 signup함수에 SignupDto를 매개변수로 받아서 로그를 찍어보자.
info에 입력했던 데이터로 잘 나온다.
이제 잘 받아오니까 이걸 database에 insert 해줘야한다.
insert 해주기 위해서는 model이 필요하다.
유저모델을 생성해주자~
domain폴더 생성
domain폴더 안에 user폴더도 만들어주자
User.java 생성
User.java
package com.cos.photogramstart.domain.user; import java.time.LocalDate; import java.time.LocalDateTime; import javax.persistence.PrePersist; // JPA - Java Persistence API (자바로 데이터를 영구적으로 저장(DB)할 수 있는 API를 제공) public class User { private int 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 LocalDateTime createDate; @PrePersist //DB INSERT 되기 직전에 실행 public void createDate() { this.createDate = LocalDateTime.now(); } }
Java
복사
이어서 더 쓰면
package com.cos.photogramstart.domain.user; import java.time.LocalDate; import java.time.LocalDateTime; import javax.persistence.Entity; import javax.persistence.PrePersist; import lombok.AllArgsConstructor; import lombok.Data; import lombok.NoArgsConstructor; // JPA - Java Persistence API (자바로 데이터를 영구적으로 저장(DB)할 수 있는 API를 제공) @AllArgsConstructor //전 생성자 @NoArgsConstructor //빈 생성자 @Data //Getter, Setter @Entity // 디비에 테이블을 생성 public class User { private int 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 //DB INSERT 되기 직전에 실행 public void createDate() { this.createDate = LocalDateTime.now(); } }
Java
복사
저장하고 나면
org.hibernate.AnnotationException: No identifier specified for entity: com.cos.photogramstart.domain.user.User
Java
복사
Primary Key(기본키)가 없어서 오류가 나는거다
id를 @Id 를 추가해줘서 Primary Key(기본키)로 만들어주자
@Id private int id;
Java
복사
저장하고 재기동 되면서
Hibernate: drop table if exists User Hibernate: create table User (id integer not null, bio varchar(255), createDate datetime(6), email varchar(255), gender varchar(255), name varchar(255), password varchar(255), phone varchar(255), profileImageUrl varchar(255), role varchar(255), username varchar(255), website varchar(255), primary key (id)) engine=InnoDB [2m2023-08-13 20:09:15.999[0;39m [32m INFO[0;39m [35m6358[0;39m [2m---[0;39m [2m[ restartedMain][0;39m [36mo.h.e.t.j.p.i.JtaPlatformInitiator [0;39m [2m:[0;39m HHH000490: Using JtaPlatform implementation: [org.hibernate.engine.transaction.jta.platform.internal.NoJtaPlatform] [2m2023-08-13 20:09:16.007[0;39m [32m INFO[0;39m [35m6358[0;39m [2m---[0;39m [2m[ restartedMain][0;39m [36mj.LocalContainerEntityManagerFactoryBean[0;39m [2m:[0;39m Initialized JPA EntityManagerFactory for persistence unit 'default' [2m2023-08-13 20:09:16.060[0;39m [32m INFO[0;39m [35m6358[0;39m [2m---[0;39m [2m[ restartedMain][0;39m [36mo.s.b.d.a.OptionalLiveReloadServer [0;39m [2m:[0;39m LiveReload server is running on port 35729 [2m2023-08-13 20:09:16.247[0;39m [32m INFO[0;39m [35m6358[0;39m [2m---[0;39m [2m[ restartedMain][0;39m [36mo.s.s.web.DefaultSecurityFilterChain [0;39m [2m:[0;39m Will secure any request with [org.springframework.security.web.context.request.async.WebAsyncManagerIntegrationFilter@2234f7eb, org.springframework.security.web.context.SecurityContextPersistenceFilter@22ce2238, org.springframework.security.web.header.HeaderWriterFilter@34f7a774, org.springframework.security.web.authentication.logout.LogoutFilter@2d01433a, org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter@23b204, org.springframework.security.web.savedrequest.RequestCacheAwareFilter@dad54c9, org.springframework.security.web.servletapi.SecurityContextHolderAwareRequestFilter@2e944cd5, org.springframework.security.web.authentication.AnonymousAuthenticationFilter@5669386e, org.springframework.security.web.session.SessionManagementFilter@514f2e86, org.springframework.security.web.access.ExceptionTranslationFilter@5ac524d, org.springframework.security.web.access.intercept.FilterSecurityInterceptor@232c9f15] [2m2023-08-13 20:09:16.356[0;39m [32m INFO[0;39m [35m6358[0;39m [2m---[0;39m [2m[ restartedMain][0;39m [36mo.s.s.concurrent.ThreadPoolTaskExecutor [0;39m [2m:[0;39m Initializing ExecutorService 'applicationTaskExecutor' [2m2023-08-13 20:09:16.641[0;39m [32m INFO[0;39m [35m6358[0;39m [2m---[0;39m [2m[ restartedMain][0;39m [36mo.s.b.w.embedded.tomcat.TomcatWebServer [0;39m [2m:[0;39m Tomcat started on port(s): 8080 (http) with context path '' [2m2023-08-13 20:09:16.653[0;39m [32m INFO[0;39m [35m6358[0;39m [2m---[0;39m [2m[ restartedMain][0;39m [36mc.c.p.PhotogramStartApplication [0;39m [2m:[0;39m Started PhotogramStartApplication in 3.803 seconds (JVM running for 4.618)
Java
복사
테이블이 잘 만들어지고 있다.
@GeneratedValue 도 추가해주자
package com.cos.photogramstart.domain.user; import java.time.LocalDate; import java.time.LocalDateTime; import javax.persistence.Entity; import javax.persistence.GeneratedValue; import javax.persistence.GenerationType; import javax.persistence.Id; import javax.persistence.PrePersist; import lombok.AllArgsConstructor; import lombok.Data; import lombok.NoArgsConstructor; // JPA - Java Persistence API (자바로 데이터를 영구적으로 저장(DB)할 수 있는 API를 제공) @AllArgsConstructor //전 생성자 @NoArgsConstructor //빈 생성자 @Data //Getter, Setter @Entity // 디비에 테이블을 생성 public class User { @Id //Primart Key(기본키)로 설정 @GeneratedValue(strategy = GenerationType.IDENTITY) //번호 증가 전략이 데이터베이스를 따라간다. private int 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 //DB INSERT 되기 직전에 실행 public void createDate() { this.createDate = LocalDateTime.now(); } }
Java
복사
mysql AUTO 전략을 쓸거고
oracle를 쓰면 SEQUENCE 전략을 쓸거다.
지금 우리는 IDENTITY 전략
DBeaver 들어가서
select * from user;
SQL
복사
밑에 테이블이 만들어진걸 볼 수 있다.
application.yml 파일 가보면은
jpa: open-in-view: true hibernate: ddl-auto: update #create 하면 데이터를 insert했는데 나중에 다시 서버를 재실행 하면 insert한 데이터가 다 사라진다. naming: physical-strategy: org.hibernate.boot.model.naming.PhysicalNamingStrategyStandardImpl show-sql: true
XML
복사
ddl-auto: update로 되어있는데 이게 create 경우 일때는
데이터를 insert했는데 나중에 다시 서버를 재실행 하면 insert한 데이터가 다 사라진다.

*참고