MemberRepository에서는 반드시 entity 객체로 작업을 해주어야 한다
-> MemberService에서 repository의 save 메소드를 호출하기 위해서는 entity 객체로 넘겨주어야 한다
-> dto를 entity로 변환하고 repository의 save 호출
1) MemberEntity 파일에 toMemberEntity 함수 만들기
public static MemberEntity toMemberEntity(MemberDTO memberDTO) {
MemberEntity memberEntity = new MemberEntity();
memberEntity.setMemberEmail(memberDTO.getMemberEmail());
memberEntity.setMemberPassword(memberDTO.getMemberPassword());
memberEntity.setMemberName(memberDTO.getMemberName());
return memberEntity;
}
(자바 기반은 역시 자동완성이 되니까 참 편하다)
(그래도 memberEntity 철자 및 가져오는 memberDTO 항목 잘 보기)
2) MemberService 파일에서 memberEntity 만들고 memberRepository.save 사용하기
public class MemberService {
private final MemberRepository memberRepository;
public void save(MemberDTO memberDTO) {
//repository의 save 메소드 호출 (entity 객체로 넘겨줄 것)
MemberEntity memberEntity = MemberEntity.toMemberEntity(memberDTO);
memberRepository.save(memberEntity);
}
}
MemberEntity의 toMemberEntity 함수로 memberDTO를 객체로 만들어주고
memberRepository의 save 함수에 들어갈 매개변수로 memberEntity를 넣어준다
-> memberRepository.save는 원래 지정된 함수이기 때문에 save가 아닌 다른 이름 불가 (JpaRepository에서 상속받은 함수임)

(자동으로 sql문을 작성해서 처리한다)

여기까지 잘 되었다면 '회원가입'을 했을 때 member_table에 각 정보가 자동으로 저장되는 것을 볼 수 있다
3) login.html 작성하기
회원가입을 완료했으니 해당 로그인 정보로 로그인을 할 수 있도록 login.html을 작성한다
<!doctype html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>login</title>
</head>
<body>
<form action="/member/login" method="post">
이메일 : <input type="text" name="memberEmail"> <br>
비밀번호 : <input type="password" name="memberPassword"> <br>
<input type="submit" value="로그인">
</form>
</body>
</html>
memberEmail과 memberPassword만 일치한다면 로그인 될 수 있도록 설정
4) MemberController에 "/member/login"에 대한 postmapping 작성
@PostMapping("/member/login")
public String login(@ModelAttribute MemberDTO memberDTO) {
MemberDTO loginResult = memberService.login(memberDTO);
if(loginResult != null) {
return "main";
} else {
return "login";
}
}
memberService의 login 함수를 통해 로그인 성공 여부를 판단하고
로그인 성공했으면 main.html로, 로그인에 실패했으면 login.html에 머무르는 것으로 코드를 작성한다
5) MemberRepository에서 이메일로 회원 조회하는 함수 작성하기
-> 이메일을 DB에서 조회하고
-> 비밀번호가 일치하는지를 판단한다
Optional<MemberEntity> findByMemberEmail(String memberEmail);
SQL문으로는 'select * from member_table where member_email=?'의 의미이며
Optional이라는 자바의 클래스를 통해 null 방지를 해준다
-> MemberEntity 형태로 받기
6) MemberService에서 MemberRepository의 findByMemberEmail 함수 사용
public MemberDTO login(MemberDTO memberDTO) {
Optional<MemberEntity> byMemberEmail = memberRepository.findByMemberEmail(memberDTO.getMemberEmail());
if(byMemberEmail.isPresent()) {
MemberEntity memberEntity = byMemberEmail.get();
if(memberEntity.getMemberPassword().equals(memberDTO.getMemberPassword())) {
MemberDTO dto = MemberDTO.toMemberDTO(memberEntity);
return dto;
} else {
return null;
}
} else {
return null;
}
}
-> byMemberEmail의 객체는 객체로 두 번 감싸진 형태이므로 memberEntity에서 byMemberEmail.get() 함수가 한 겹을 떼주는 역할
-> memberEntity로 받은 패스워드가 memberDTO에 있는 패스워드와 같은지 보기 위해 equals 함수 사용 (== 안됨)
-> 아이디가 없거나 비밀번호가 일치하지 않으면 null 반환
-> 회원 정보가 존재한다면 entity 객체를 dto로 변환해서 반환해주기
7) MemberDTO에서 memberEntity를 MemberDTO로 변환하는 함수 작성하기
public static MemberDTO toMemberDTO(MemberEntity memberEntity) {
MemberDTO memberDTO = new MemberDTO();
memberDTO.setId(memberEntity.getId());
memberDTO.setMemberEmail(memberEntity.getMemberEmail());
memberDTO.setMemberPassword(memberEntity.getMemberPassword());
memberDTO.setMemberName(memberEntity.getMemberName());
return memberDTO;
}
Id도 빼먹지 않고 setId로 변환을 해주어야 한다
죄다 자동 완성이 되니 금방 작성할 수 있어서 좋다
8) 로그인 할 때 세션 관리하기
MemberController의 @PostMapping("/member/login")에서 로그인 할 때 HttpSession으로 session을 관리해준다

9) main.html 작성하기
thymeleaf를 사용한다
-> session.loginEmail로 세션 정보 확인

DB에 저장된 이메일과 비밀번호를 입력했을 때 로그인이 성공한 모습을 볼 수 있다
세선에 담긴 memberEmail도 확인 가능