본문 바로가기
Spring/SpringBoot

[goormedu 강의] 스프링부트 블로그 만들기 05 - 12 전통적인 방식의 로그인 방법

by 코딩맛 2024. 8. 30.
해당 글은 groomedu의 스프링부트 나만의 블로그 만들기 강의를 보고 개인적으로 정리한 글입니다.


로그인 시 username 값과 password 값을 받아서 DB에 있는지 조회하는데

Repository에서 관련하여 select 해줄 때 사용하는 방식 2가지

 

Repository

1. JPA Naming 쿼리

//SELECT * FROM user WHERE username = ? AND password = ?
User findByUsernameAndPassword(String username, String password);

 

2. 네이티브 쿼리

@Query(value="SELECT * FROM user WHERE username = ? AND password = ?", nativeQuery=true)
User login(String username, String password);

 

Service

@Transactional(readOnly = true) // select 할 때 트랜잭션 시작 , 서비스 종료시에 트랜잭션 종료(정합성 유지)  
public User login(User user) {
    return userRepository.findByUsernameAndPassword(user.getUsername(),user.getPassword());
}

@Transactional 로 지정한 뒤 readOnly = ture 해줌으로써

select 할 때 트랜잭션 시작하고 서비스 종료시에 트랜잭션을 종료함 → 정합성을 유지함.

 

Controller

@PostMapping("/api/user/login")
public ResponseDto<Integer> login(@RequestBody User user, HttpSession session){
	System.out.println("UserApiController : login 호출됨.");
	User principal = userService.login(user); //principal(접근주체)
	
	if(principal != null) {
		session.setAttribute("principal", principal); //세션 생성 
	}
	return new ResponseDto<Integer>(HttpStatus.OK.value(),1);
}

HttpSession은 상단에 선언할 수 있음.

@Autowired
private HttpSession session;

session 객체는 스프링에서 bean으로 등록해서 가지고 있어 위와 같이 DI 할 수 있음.

 

view

<c:choose>
    <c:when test="${empty sessionScope.principal}">
        <ul class="navbar-nav">
          <li class="nav-item"><a class="nav-link" href="/blog/user/loginForm">로그인</a></li>
          <li class="nav-item"><a class="nav-link" href="/blog/user/joinForm">회원가입</a></li>    
        </ul>
    </c:when>
    <c:otherwise>
        <ul class="navbar-nav">
          <li class="nav-item"><a class="nav-link" href="/blog/board/writeForm">글쓰기</a></li>
          <li class="nav-item"><a class="nav-link" href="/blog/user/userForm">회원정보</a></li>
          <li class="nav-item"><a class="nav-link" href="/blog/user/logout">로그아웃</a></li>    
        </ul>
    </c:otherwise>
</c:choose>

header.jsp에서는 세션에 principal 값이 있는지 유무에 따라 메뉴를 구분하여 화면에 출력할 수 있음

 

1. 세션에 principal 값이 있다.

- 로그인

- 회원가입

 

2. 세션에 principal 값이 없다.

- 글쓰기 

- 회원정보

- 로그아웃