회원가입을 위한 Dto와 DB연결을 위한 Model 생성
1. SignupDto 생성
시큐리티 세팅을 끝나고 회원가입 기능 구현을 위해 첫 번째로 할 작업은 User Model을 만드는 것이다.
클라이언트가 회원가입에서 POST 요청하여 DB에 INSERT되게 될 곳이 User이기 때문이다.
따라서, 회원가입 페이지에서 클라이언트가 input 태그에 넣게 될 데이터의 형태에 맞는
DTO(Data Transfer Object)를 만들어 주어야 한다.
SignupDto.java
package com.GStagram.domain.auth;
import lombok.Data;
@Data // Getter, Setter
public class SignupDto {
private String username;
private String password;
private String email;
private String name;
}
- @Data 어노테이션은 Getter, Setter, toString을 자동으로 생성해주는 어노테이션이다.
2. AuthController 수정
그 다음으로 AuthController에서 form태그로 받은 데이터를 dto로 받아와야한다.
스프링부트는 form 태그로 받은 데이터를 key-value로 들어오기 때문에 매개변수를 받을 때에도
key=value로 받아주어야 한다.
AuthController.java
package com.GStagram.domain.auth;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
@Controller
@Slf4j
public class AuthController {
@GetMapping("/auth/login")
public String loginPage() {
return "auth/login";
}
@GetMapping("/auth/signup")
public String signupPage() {
return "auth/signup";
}
@PostMapping("/auth/signup")
public String signup(SignupDto signupDto) { // key = value (x-www-form-urlencoded)
log.info(signupDto.toString());
return "auth/login"; // 회원가입이 완료되면 로그인 페이지로 이동한다.
}
}
- @Slf4j 어노테이션은 프로그램 개발 중이나 완료 후 발생할 수 있는 오류에 대해 디버깅하거나
운영 중인 프로그램 상태를 모니터링 하기 위해 필요한 정보(로그)를 기록하는 Logging을 위한 어노테이션이다.
다시 회원가입을 실행해보면 아래와 같이 콘솔창에서 데이터를 받아온 것을 확인할 수 있다.
2022-10-24 19:05:15.498 INFO 42908 --- [nio-8080-exec-8] com.GStagram.domain.auth.AuthController : SignupDto(username=repeater2487, password=1234, email=repeater2487@naver.com, name=이민혁)
3. User Model 생성
클라이언트가 입력한 데이터를 DTO를 통해서 잘 받아 온것을 확인했으니,
DB에 이 데이터를 INSERT하면 된다.
DB에 데이터를 INSERT하기 위해서는 Model이 필요하다
User.java
package com.GStagram.model;
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;
@AllArgsConstructor // 모든 생성자를 자동으로 만들어주는 어노테이션
@NoArgsConstructor // 빈 생성자를 자동으로 만들어주는 어노테이션
@Data // 자동으로 Getter, Setter, toString을 만들어주는 어노테이션
@Entity // DB에 테이블을 생성해주는 어노테이션
public class User {
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Id // Primary Key를 지정해주는 어노테이션
private Integer 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 prifileImageUrl; // 프로필 사진
private String role; // 권한
private LocalDateTime createDate; // 데이터가 입력된 시간.
@PrePersist // DB에 데이터가 INSERT되기 직전에 실행
public void createDate() {
this.createDate = LocalDateTime.now();
}
}
우리가 사용하고 있는 ORM(Object-relational mapping : 객체 관계 매핑)은 JPA(Java Persistence API)를
사용하고 있는데, JAVA로 데이터를 영구적으로 DB에 저장 할 수 있는 기술을 말한다.
이 기술을 사용하면 JAVA코드로 DB에 데이터를 쉽게 INSERT할 수 있다.
- @Prepersist 어노테이션은 DB에 데이터를 INSERT되기 직전에 함수를 실행 하는 어노테이션이며,
이 것을 이용해 자동으로 가입시간을 DB에 저장할 수 있다. - @GeneratedValue와 @Id 어노테이션은 Primary Key를 위한 어노테이션이다.
4. h2 Database 설정 및 h2-console에서 확인
테스트 하기 위한 데이터 베이스로 h2-database를 사용한다.
build.gradle에 의존성 추가
runtimeOnly 'com.h2database:h2'
application.properties 설정
spring.h2.console.enabled=true
spring.datasource.url=jdbc:h2:mem:testdb
h2-console에서 확인
Connet를 누르고 접속해보면 아래와 같이 에러가 발생한다.
5. h2-console에러 수정
Spring Security와 h2-console이 충돌하여 발생하는 에러이다.
이 부분을 해결하기 위해서 SpringSecurity에서 3가지를 수정해야한다.
- H2 데이터베이스 콘솔 url 요청에 대한 허용
- CSRF 중지
- X-Frame-Potions in Spring Securty 중지
각각 코드로 본다면
- http.authorizeRequests().antMatchers("/h2-console/*").permitAll()
- http.csrf().disable()
- http.headers().frameOptions().disable()
여기서 1번과 2번은 기존에 수정하였고
마지막 3번만 수정하면 된다.
SpringSecurity.java
package com.GStagram.config;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;
@EnableWebSecurity // 해당 파일로 시큐리티를 활성화
@Configuration // IOC
public class SecurityConfig extends WebSecurityConfigurerAdapter {
@Override
protected void configure(HttpSecurity http) throws Exception {
// super 삭제 - 기존 시큐리티가 가지고 있는 기능이 다 비활성화됨.
// 인증이 되지 않은 모든 사용자는 로그인 페이지로 이동
http.headers().frameOptions().disable();
http.csrf().disable();
http
.authorizeRequests() // URL별 관리
.antMatchers("/auth/**", "/css/**","/images/**","/js/**","/h2-console/**").permitAll() //유저 관련 페이지만 접근 가능
.anyRequest().authenticated() // 설정된 값들 이외 나머지 URL은 인증된 사용자만 접근 가능
.and()
.formLogin()
.loginPage("/auth/login") // GET
.defaultSuccessUrl("/");
}
}
다음과 같이 접속이 잘 되는 모습을 볼 수 있다.
테이블도 생성된 것을 확인 할 수 있다.