스프링부트 블로그 만들기 – 회원가입
회원가입
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으로 테스트를 해 볼 수 있다.
맥과 윈도우에서 모양이 조금 달라요.
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);
...중략...
}
회원가입 부가기능
스프링부트 블로그 만들기 - 암호화프로그램을 만들 때 핵심기능을 만들기 전후로 부가기능을 추가해줘야 한다. 핵심기능을 부가기능과 분리시켜 함수로 만들어 재사용하면 아주 편하게 코딩을 할 수 있다. 하지만 함수로 만들기 위한 공통 로직을 찾는 것은 결코 쉬운 일이 아니다....


