회원가입 시 데이터를 받아줄 MemberRequestDto를 만들어 주었다.
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
@Data
@AllArgsConstructor
@NoArgsConstructor
public class MemberRequestDto {
private String memberId;
private String name;
private String password;
private String auth;
private String nickname;
}
MemberRepository도 만들었다.
나는 Spring Data Jpa로 jpa를 시작했었지만 김영한님의 강의를 보던중 jpa로 시작해서 공부하는 것이 맞다고 하셨기 때문에 이번엔 jpa를 공부하면서 할 예정이다.
import jakarta.persistence.EntityManager;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Repository;
@Repository
@RequiredArgsConstructor
public class MemberRepository {
private final EntityManager em;
public void save(Member member) {
em.persist(member);
}
}
securityConfig에
@Bean
public BCryptPasswordEncoder bCryptPasswordEncoder() {
return new BCryptPasswordEncoder();
}
이 코드도 추가해준다.
이는 비밀번호를 쉽게 암호화 하는데 사용한다.
loginForm과 joinForm을 만들었다.
loginForm
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>로그인 페이지</title>
</head>
<body>
<h1>login</h1>
<hr/>
<form action="/login" method="POST">
<input type="text" name="memberId" placeholder="id">
<input type="password" name="password" placeholder="password">
<button>로그인</button>
</form>
<a href="/joinForm">회원가입</a>
</body>
</html>
타임리프 방식도 공부하면서 사용해보기로 했다.
joinForm
<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<head>
<meta charset="UTF-8">
<title>회원가입 페이지</title>
</head>
<body>
<h1>signUp</h1>
<hr/>
<form th:object="${memberRequestDto}" th:action="@{/joins}" method="post" >
<input type="text" th:field="*{memberId}" name="memberId" placeholder="아이디">
<input type="password" th:field="*{password}" name="password" placeholder="비밀번호">
<input type="text" th:field="*{name}" name="name" placeholder="이름">
<input type="text" th:field="*{nickname}" name="userNickName" placeholder="닉네임">
<button type="submit">회원가입</button>
</form>
</body>
</html>
memberController에 html로 이동하고 회원가입 하는 코드를 만들어준다.
private final MemberRepository memberRepository;
private final BCryptPasswordEncoder bCryptPasswordEncoder;
// 주소창에 joinForm을 쓰면 joinForm.html로 이동시키는 코드이다.
// memberRequestDto를 미리 선언해주고 html에서 사용할 수 있도록 해준다.
@GetMapping("/joinForm")
public String joinForm(Model model) {
model.addAttribute("memberRequestDto", new MemberRequestDto());
return "joinForm";
}
// 회원가입을 해주는 코드이다.
//트랜잭션 어노테이션을 꼭 사용해야 하고 롬복의 builder를 이용해 dto에서 Member 객체로 저장하고 리포지토리에서 db로 저장한다.
@Transactional
@PostMapping("/joins")
public @ResponseBody String join(MemberRequestDto memberRequestDto) {
String password = bCryptPasswordEncoder.encode(memberRequestDto.getPassword());
Member.MemberBuilder builder = Member.builder()
.memberId(memberRequestDto.getMemberId())
.password(password)
.nickname(memberRequestDto.getNickname())
.name(memberRequestDto.getName())
.auth("user");
Member member = builder.build();
memberRepository.save(member);
return "joins";
}
이렇게 하고 회원가입을 해주면
이렇게 저장이 된다.
1번은 bCryptPasswordEncoder를 사용하지 않았고
2번은 bCryptPasswordEncoder를 사용했다.