springboot + jpa로 간단한 로그인을 만드는 중
아이디와 패스워드 null 체크를 ==연산자로 하기보다 이미 있는 Optional메소드를 사용해서 효율적으로 만들고 싶었다.
<Repository>
JpaRepository를 상속하는 JpaMemberRepository 인터페이스 클래스를 만들어준다.
import mood.moodmyapp.domain.Member;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.Query;
import org.springframework.data.repository.query.Param;
import org.springframework.stereotype.Repository;
import java.util.List;
import java.util.Optional;
@Repository
public interface JpaMemberRepository extends JpaRepository<Member, String>, MemberRepository {
// 비워있어도 잘 작동함
// JpaRepository 인터페이스를 상속받을 때 엔티티 클래스의 타입(Member)과 PK에 해당하는 데이터 타입(String) 선언하면
//해당 엔티티 클래스와 매핑되는 테이블의 CRUD기능을 사용할 수 있다.
@Override
Member save(Member member);
@Override
Optional<Member> findById(String id);
@Override
@Query("SELECT m FROM Member m WHERE m.userName = :userName")
Optional<Member> findByName(@Param("userName") String userName);
@Query("SELECT m FROM Member m WHERE m.userId = :userId AND m.userPw = :userPw")
@Override
Optional<Member> findByIdAndPw(String userId, @Param("userPw")String userPw);
}
Optional<Member>타입의 아이디와 비밀번호를 찾는 메서드를 작성한다.
파라미터로 userId, userPw를 받아야하는데 userId는 @Id 로 선언해준 값이라서 파라미터 세팅이 따로 필요하지않은데
@Id 어노테이션이 없는 나머지 칼럼들은 파라미터 세팅이 필요하다.
그래서 @Param 어노테이션 선언 후 @Query 어노테이션 추가 후 사용자 정의쿼리를 작성한다.
쿼리를 조회할때 테이블을 조회하는게 아니라 클래스를 조회한다.
SELECT m FROM Member m WHERE m.userId = :userId AND m.userPw = :userPw
위 조건절 쿼리를 mybatis에서 작성했다면 WHERE userId = ${userId} AND userPw = ${userPw}; 이런식이었을것..
<Service>
package mood.moodmyapp.service;
import mood.moodmyapp.domain.Member;
import mood.moodmyapp.repository.MemberRepository;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.util.Optional;
@Transactional
@Service
public class LoginService {
@Autowired
private final MemberRepository memberRepository;
public LoginService(MemberRepository memberRepository) {
this.memberRepository = memberRepository;
}
public boolean login(Member member) {
Optional<Member> findIdAndPw = memberRepository.findByIdAndPw(member.getUserId(), member.getUserPw());
if (findIdAndPw.isPresent()) {
System.out.println("로그인 성공");
return true;
}
System.out.println("로그인 실패");
return false;
}
}
member에서 .get()메서드를 사용하여 사용자가 입력한 아이디와 비밀번호를 받아서 findIdAndPw 객체에 넣는다.
Optional에서 제공하는 메서드중에 isPresent(), ifPresent()는 반환타입이 다르다.
1. isPresent()는 반환값이 boolean 타입. Optional객체가 값을 가지고 있다면 return true, 없으면 return false.
2. ifPresent() 반환값이 void타입(return이 없다).
return void 하고싶을때 사용하면 된다.
나는 true false로 로그인 성공과 실패를 나눠주고싶어서
isPresent()를 사용했어야하는데
ifPresent()를 써서 빨간줄이 떴었다...이래서 뭔가 쓸때는 뭔지 알고 써야하는것....
<Controller>
package mood.moodmyapp.controller;
import mood.moodmyapp.domain.Member;
import mood.moodmyapp.service.LoginService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import javax.enterprise.inject.Model;
@Controller
@RequestMapping(value="/login")
public class LoginController {
@Autowired
private final LoginService loginService;
public LoginController(LoginService loginService) {
this.loginService = loginService;
}
@GetMapping("/login.do")
public String loginForm(){
return "/login/login";
}
@PostMapping("login.do")
public String loginProc(@ModelAttribute Member member){
if(loginService.login(member)){
return "redirect:/";
}
return "/login/login";
}
}
'자바' 카테고리의 다른 글
[자바의 정석] ch2-11 기본형의 종류와 범위 (0) | 2022.11.20 |
---|---|
[spring] redirect 사용 (0) | 2022.09.04 |
[백준 1152] 자바 단어의 개수 (0) | 2022.08.13 |
[java]LinkedList (0) | 2021.12.02 |
Hashmap 관련함수 (0) | 2021.11.24 |