JAVA

스프링부트 블로그 만들기 – 5강 회원가입

blog app

스프링부트 블로그 만들기 – 회원가입

회원가입

1.회원가입 페이지에서 데이터를 넘겨줄 수 있게 만들어준다.
<%@ page language="java" contentType="text/html; charset=UTF-8"
  pageEncoding="UTF-8"%>

<%@ include file="../layout/header.jsp"%>

<div class="container p-4 w-25 bg-light rounded shadow">
  <h5 style="font-family: 'IBM Plex Sans KR', sans-serif; margin-bottom: 30px;">회원가입</h5>
  <form action="/join" method="post">
    <div class="form-group">
      <input type="text" class="form-control" name="username" placeholder="Enter username" required="required" maxlength="20">
    </div>
    <div class="form-group">
      <input type="password" class="form-control" name="password" placeholder="Enter password" required="required" maxlength="20">
    </div>
    <div class="form-group">
      <input type="email" class="form-control" name="email" placeholder="Enter email">
    </div>
    <button type="submit" class="btn btn-primary col-md-4" style="margin-top: 30px;">회원가입</button>
  </form>
</div>

<%@ include file="../layout/footer.jsp"%>

 

2.회원가입 DTO(Data Transfer Oject) 를 만들어준다.

DTO(Data Transfer Object)란 통신을 위한 오브젝트로 변수를 적는 대신 함수로 만들어 재사용할 수 있게 만든다. jsp 파일의 form 태그에서 name으로 데이터를 받아올 때 일반 변수로 받으면 MINE Type으로 데이터를 받아오는데 이렇게 만들면 validation 타입으로 받을 수 없어지기 때문에 Dto를 사용하여 타입에 상관없이 받을 수 있게 만드는 것이다.

방법1. 개인 프로젝트

package com.cos.blogapp.web.dto;

import com.cos.blogapp.domain.user.User;

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

@Data
@NoArgsConstructor
@AllArgsConstructor
public class JoinReqDto {
  private String username;
  private String password;
  private String email;
  
  public User toEntity() {
    User user = new User();
    user.setUesrname(username);
    user.setPassword(password);
    user.setEmail(email);
    return user;
  }
}
join 메서드를 실행할 때 DTO에서 toEntity라는 함수로 만들어 사용하면 호출시 코드가 깔끔해지고 재사용에 용이해집니다.

방법2. 회사 실무

package com.cos.blogapp2.web.dto;

 import com.cos.blogapp2.domain.user.User;

 import lombok.AllArgsConstructor;
 import lombok.Getter;

 @AllArgsConstructor
 @Getter
 public class JoinReqDto {
 	private String username;
 	private String password;
 	private String email;

 	public User toEntity() {
 		
 		User user = User.builder()
 				.password(password)
 				.username(username)
 				.email(email)
 				.build();
 		return user;
 	}
 }
Builder를 사용하면 toEntity를 만들 때 순서안지켜도 되고 넣고 싶은 것만 넣을 수 있다는 장점이 있어요.
3.회원가입(join) 메서드를 만들어 User 정보를 JoinReqDto.java에 만들어둔 toEntity로 가져온다.
@RequiredArgsConstructor //DI
@Controller
public class UserController {
        //DI(Dependency Injection, 의존성 주입)
 	private final UserRepository userRepository;

 	@PostMapping("/join")
 	public String join(JoinReqDto dto) { 

 		User user = dto.toEntity();
 		userRepository.save(user);

 		return "redirect:/loginForm";
 	}

        ... 중략 ...
}

@RequiredArgsConstructor : final이 붙은 모든 필드의 생성자를 자동으로 생성한다.

redirect(302) : 사용자가 A페이지 요청했을 때 B페이지를 돌려주는 것

 

비밀번호 해시 설정

1.util 패키지 안에 SHA.java 파일을 만들어준다.
package com.cos.blogapp2.util;

 import java.security.MessageDigest;
 import java.security.NoSuchAlgorithmException;

 public class SHA {

 	public static String encrypt(String rawPassword) {
 		// 1. SHA256 함수를 가진 클래스 객체 가져오기
 		MessageDigest md = null;
 		try {
 			md = MessageDigest.getInstance("SHA-256"); // SHA-256, SHA-512
 		} catch (NoSuchAlgorithmException e) {
 			e.printStackTrace();
 		}

 		// 2. 비밀번호 1234 -> SHA256 던지기
 		md.update(rawPassword.getBytes());

 		// 3. 암호화된 글자를 16진수로 변환(헥사코드)
 		StringBuilder sb = new StringBuilder();
 		for(Byte b : md.digest()) {
 			sb.append(String.format("%02x", b));
 		}
 		return sb.toString();
 	}
 }

SHA.java 테스트

스프링에서 테스트를 할 수 있는 파일이 따로 존재하니 여기에서 junit으로 테스트를 해 볼 수 있다.
spring test
맥과 윈도우에서 모양이 조금 달라요.
package com.cos.blogapp.util;

 import java.security.MessageDigest;
 import java.security.NoSuchAlgorithmException;

 import org.junit.jupiter.api.Test;

 public class SHATest {

 	@Test
 	public void encrypt() {
 		String salt = "코스";
 		String rawPassword = "1234!"+salt;

 		// 1. SHA256 함수를 가진 클래스 객체 가져오기
 		MessageDigest md = null;
 		try {
 			md = MessageDigest.getInstance("SHA-256");
 		} catch (NoSuchAlgorithmException e) {
 			// TODO Auto-generated catch block
 			e.printStackTrace();
 		}

 		// 2. 비밀번호 1234 -> SHA256 던지기
 		md.update(rawPassword.getBytes());

 //		for(Byte b : rawPassword.getBytes()) {
 //			System.out.print(b);
 //		}

 		System.out.println();

 		StringBuilder sb = new StringBuilder();
 		for(Byte b : md.digest()) {
 			sb.append(String.format("%02x", b));
 		}
 		System.out.println(sb.toString());
 		System.out.println(sb.toString().length());

 	}
 }

암호화 알고리즘 종류
SHA-256
SHA-512

2.JoinReqDto.java 파일에 @setter 추가한다.
...중략...
import lombok.Setter;

@AllArgsConstructor
@Getter
@Setter
public class JoinReqDto {
  private String username;
  private String password;

...중략...
}
3.UserController에서 해시로 받아준다.
...중략...
@PostMapping("/join")
        public String join(JoinReqDto dto) {

 		String encPasword = SHA.encrypt(dto.getPassword()); 
 		dto.setPassword(encPasword);
 		User user = dto.toEntity();
 		userRepository.save(user);
...중략...
}

 

회원가입 부가기능

blog app
스프링부트 블로그 만들기 - 암호화프로그램을 만들 때 핵심기능을 만들기 전후로 부가기능을 추가해줘야 한다. 핵심기능을 부가기능과 분리시켜 함수로 만들어 재사용하면 아주 편하게 코딩을 할 수 있다. 하지만 함수로 만들기 위한 공통 로직을 찾는 것은 결코 쉬운 일이 아니다....
최신글