Project/인스타그램 클론코딩(중단)

[Spring] 인스타그램 클론코딩 003. 회원가입 - SignupDto 생성

마볼링 2022. 10. 24. 19:12
회원가입을 위한 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가지를 수정해야한다.

  1. H2 데이터베이스 콘솔 url 요청에 대한 허용
  2. CSRF 중지
  3. X-Frame-Potions in Spring Securty 중지

각각 코드로 본다면

  1. http.authorizeRequests().antMatchers("/h2-console/*").permitAll()
  2. http.csrf().disable()
  3. 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("/");
   }
}

다음과 같이 접속이 잘 되는 모습을 볼 수 있다.

테이블도 생성된 것을 확인 할 수 있다.

 

 

 

GitHub - minhyeok2487/Gstagram: 인스타그램 클론코딩 Gstagram

인스타그램 클론코딩 Gstagram. Contribute to minhyeok2487/Gstagram development by creating an account on GitHub.

github.com