Search

18. 스프링부트 포토그램 인증 회원가입 완료

포토그램 인증 구현하기

회원가입 구현

User 오브젝트에다가 SignupDto의 데이터를 넣을거다.
SignupDto.java
public User toEntity() { }
Java
복사
함수를 추가해주면서
User.java에 @Builder를 추가해주자.
@Builder @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
복사
다시 SignupDto.java에
public User toEntity() { return User.builder() .username(username) .password(password) .email(email) .name(name) .build(); }
XML
복사
toEntity함수는
4개의 데이터를 기반으로 User객체가 만들어지고, 다 만들어지면 .build()해서 리턴 시키는거다.
AuthController.java
//회원가입버튼 -> /auth/signup/ -> /auth/signin @PostMapping("/auth/signup") public String signup(SignupDto signupDto) { //key=value (x-www-form-urlencoded) log.info(signupDto.toString()); //User <- SignupDto User user = signupDto.toEntity(); log.info(user.toString()); return "auth/signin"; }
Java
복사
회원가입 데이터 입력 후 버튼 클릭 시
콘솔에서
cos.photogramstart.web.AuthController [0;39m [2m:[0;39m User(id=0, username=ssar, password=1234, name=, website=null, bio=null, email=ssar@nate.com, phone=null, gender=null, profileImageUrl=null, role=null, createDate=null)
Java
복사
잘 넘겨주고 있다.
이제 데이터가 잘 오는거 까지 확인도 했고 DB에 적재하도록 하자.
DB에 적재할려면 서비스가 필요하다.
service 폴더 생성
AuthService.java 생성
AuthService.java에
package com.cos.photogramstart.service; import org.springframework.stereotype.Service; import com.cos.photogramstart.domain.user.User; @Service //1. IoC등록 2.트랜잭션 관리 public class AuthService { public void 회원가입(User user) { //회원가입 진행 } }
Java
복사
회원가입 진행을 위해서 레파지토리가 필요하다.
UserRepository 인터페이스 생성
UserRepository.java
package com.cos.photogramstart.domain.user; import org.springframework.data.jpa.repository.JpaRepository; //어노테이션 없이도 JpaRepository를 상속하면 IoC가 자동으로 등록 //오브젝트, 프라이머리키 타입 public interface UserRepository extends JpaRepository<User, Integer>{ }
Java
복사
signup함수를 요청할때 서비스를 불러와야 한다.
AuthController.java에
첫번째 방식으로는
DI(Dependency Injection)에서 불러올때 @Autowired를 붙여주자.
@Autowired private AuthService authService
Java
복사
추가
두번째 방식으로는
AuthController의 생성자를 만들어준다.
private AuthService authService; public AuthController(AuthService authService) { this.authService = authService; }
Java
복사
@Controller가 붙어 있으면 스프링이 AuthController를 자기들 컨테이너리 관리하는 메모리에다가 AuthController를 메모리 객체를 생성해서 로드를 하는데,
객체를 생성하기 위해서는 첫번째 조건) 생성자를 만들어야한다.
public AuthController(AuthService authService) { this.authService = authService; }
Java
복사
생성자를 실행시킬려고 보니까 authService가 있어야한다. 넣어줄려면 이미 IoC에 등록한 애들 중에 authService타입이 있으면 넣어준다.(의존성 주입)
없으면 주입을 안해준다.
지금은 저장해주면 콘솔에 오류가 안나는데
만약에 AuthService.java에서 @Service 부분을 주석하고 다시저장하면 오류가 난다.
Consider defining a bean of type 'com.cos.photogramstart.service.AuthService' in your configuration.
Java
복사
AuthService가 IoC에 없다는 뜻이다.
AuthController를 IoC에 등록(@Controller)을 할려면 생성자를 실행시켜야하는데 authService가 없어서
AuthController객체를 못만드는거다.
→ 의존성 주입
근데 저렇게 생성자를 만들어서 진행하면 조금 번거로워서
private final AuthService authService; // public AuthController(AuthService authService) { // this.authService = authService; // }
Java
복사
final를 추가해주면 빨간라인으로 오류가 난다
java에서는 전역변수에 final이 걸려 있으면 무조건 생성자를 실행할때 or 객체가 생성할때 초기화를 시켜줘야한다.
해당 자바에 어노테이션으로 @RequiredArgsConstructor를 추가해주면 오류가 사라진다.
@RequiredArgsConstructor→ final이 걸려 있는 모든 애들에 대한 생성자를 만들어준다.
//회원가입버튼 -> /auth/signup/ -> /auth/signin @PostMapping("/auth/signup") public String signup(SignupDto signupDto) { //key=value (x-www-form-urlencoded) log.info(signupDto.toString()); //User <- SignupDto User user = signupDto.toEntity(); log.info(user.toString()); authService.회원가입(user); return "auth/signin"; }
Java
복사
authService.회원가입(user); 추가
package com.cos.photogramstart.web; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PostMapping; import com.cos.photogramstart.domain.user.User; import com.cos.photogramstart.service.AuthService; import com.cos.photogramstart.web.dto.auth.SignupDto; import lombok.RequiredArgsConstructor; @RequiredArgsConstructor // final 필드를 DI 할때 사용 @Controller // 1. IoC 등록 2. 파일을 리턴하는 컨트롤 public class AuthController { private static final Logger log = LoggerFactory.getLogger(AuthController.class); private final AuthService authService; // public AuthController(AuthService authService) { // this.authService = authService; // } @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()); //User <- SignupDto User user = signupDto.toEntity(); log.info(user.toString()); authService.회원가입(user); return "auth/signin"; } }
Java
복사
AuthService.java
package com.cos.photogramstart.service; import org.springframework.stereotype.Service; import com.cos.photogramstart.domain.user.User; import com.cos.photogramstart.domain.user.UserRepository; import lombok.RequiredArgsConstructor; @RequiredArgsConstructor @Service //1. IoC등록 2.트랜잭션 관리 public class AuthService { private final UserRepository userRepository; public User 회원가입(User user) { //회원가입 진행 User userEntity = userRepository.save(user); return userEntity; } }
Java
복사
@RequiredArgsConstructor 추가와 db응답값을 받아주자.
AuthController.java에서
//회원가입버튼 -> /auth/signup/ -> /auth/signin @PostMapping("/auth/signup") public String signup(SignupDto signupDto) { //key=value (x-www-form-urlencoded) log.info(signupDto.toString()); //User <- SignupDto User user = signupDto.toEntity(); log.info(user.toString()); User userEntity = authService.회원가입(user); System.out.println(userEntity); return "auth/signin"; }
Java
복사
서비스 응답 값 받아서 콘솔에 찍어보자.
가입 버튼 클릭하면은
500 에러가 난다
: (conn=2063) Field id' doesn't have a default value insert into User (bio, •createDate, email, gender, name, password, phone, profilelmageUrl, role, username, website) values (?,?,?,?,?,?,?,?,?,?,?)
Java
복사
User.java에서 설정했던
@GeneratedValue(strategy = GenerationType.IDENTITY) 의 IDENTITY전략이 안먹고 있다.
왜냐면 @GeneratedValue(strategy = GenerationType.IDENTITY) 주기전에 DB테이블을 생성을 했고
그다음에 줬기 때문에 테이블에 적용이 안됐다.
테이블의 스키마를 변경할려면 application.yml에서
jpa: open-in-view: true hibernate: ddl-auto: create naming: physical-strategy: org.hibernate.boot.model.naming.PhysicalNamingStrategyStandardImpl show-sql: true
XML
복사
create로 바꿔서 저장해주자.
이렇게 id의 auto-increment 생성
그리고 다시 데이터 안사라지게 update로 변경해주자.
다시 등록하면
로그인 화면으로 잘 넘어온다. 가입성공
DBeaver 가면 데이터가 잘 들어갔다
여기서 문제는 password가 암호화가 안되서 들어갔다. 권한도 추가로 넣어서 진행해보자!

*참고