포토그램 인증 구현하기
회원가입 구현
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가 암호화가 안되서 들어갔다. 권한도 추가로 넣어서 진행해보자!