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