책 스프링부트와 AWS로 혼자 구현하는 웹서비스 따라하기


시작 👊

좋습니다. 로그인 코드도 개선하고 테스트 까지 해봤습니다.

지금 우리가 만든 서비스는 애플리케이션을 재실행하면 로그인이 풀립니다. 왜 그럴까요?

왜냐면 세션이 저장이 안 됩니다!

이는 세션이 내장 톰캣의 메모리에 저장되기 때문입니다. 기본적으로 세션은 실행되는 WAS(Web Application Server) 의 메모리에서 저장되고 호출됩니다. 메모리에 저장되다 보니 내장 톰캣처럼 애플리케이션을 실행했을 때 세션이 실행되는 구조에서는 항상 초기화될 수밖에 없습니다. 그리고 2대 이상의 서버에서 서비스하고 있다면 톰캣마다 세션 동기화 설정을 해야만합니다. 그래서 실제 현업에서는 세션 저장소에 대해 다음의 3가지 중 한 가지를 선택합니다.

  • 톰캣 세션을 사용한다.
    • 일반적으로 별다른 설정을 하지 않을 때 기본적으로 선택되는 방식입니다. 이 경우 톰캣(WAS)에 세션이 저장되기 때문에 2대 이상의 WAS 가 구동되는 환경에서는 톰캣들 간의 세션 공유를 위한 추가 설정이 필요합니다.🤔(위에서 말한 동기화 말하는 건가?)
  • MySQL과 같은 데이터베이스를 세션 저장소로 사용한다.
    • 여러 WAS 간의 공용 세션을 사용할 수 있는 가장 쉬운 방법입니다.
    • 대신 많은 설정이 필요없지만, 로그인 요청마다 DB IO가 발생하여 성능상 이슈가 발생할 수 있습니다.
    • 보통 로그인 요청이 많이 없는 백오피스, 사내 시스템 용도에서 사용합니다.
  • Redis, Memcached 와 같은 메모리 DB 를 세션 저장소로 사용한다.
    - B2C 서비스에서 가장 많이 사용하는 방식 입니다.
    - 실제 서비스로 사용하기 위해서는 Embedded Redis 와 같은 방식이 아닌 외부 메모리 서버가 필요합니다.


    여기서는 두 번째 방식인 데이터베이스를 세션 저장소로 사용하는 방식을 선택하여 진행하겠습니다. 선택한 이유는 설정이 간단하고 이 프로젝트가 사용자가 많은 서비스가 아니기에 비용 절감을 위해서 입니다.

이후 AWS 에서 이 서비스를 배포하고 운영할 때를 생각하면 레디스와 같은 메모리 DB를 사용하는 것은 부담스럽습니다. 왜냐면, 레디스와 같은 서비스에 별도 사용료를 지불해야하기 때문입니다. 사용자가 없는 현재 단계에서는 데이터베이스로 모든 기능을 처리하는게 부담이 적습니다.

좋습니다. 서비스 사이즈가 커지면 비용 걱정없이 레디스 같은 메모리 DB를 사용해보겠습니다.

세션 저장소를 만들어보자

의존성 등록하기

  1. build.gradlespring-session-jdbc 를 등록한다.
// build.gradle

	...

	implementation('org.springframework.session:spring-session-jdbc')

	...

근데 갑자기 생각난 건데 내가 예전에 gradle 오류가 나서 버전을 낮췄는데, compile을 써야하는 거 아닌가? implementation 을 계속 쓰고 있었네 여태. 바보같이.
근데 왜 작동하는거지...?

  1. application.properties 에 세션 저장소를 jdbc 로 선택하도록 코드를 추가합니다.
# application.properties

...

spring.session.store-type=jdbc
  1. gradle 을 다시 재실행하면서 설치해주자

다시 실행해서 테스트해보자

변경은 끝났으니 애플리케이션을 실행해서 로그인을 해봅시다.

  1. 로그인 해놓고, h2-console 로 들어간다.

세션을 위한 테이블 2개가 생성됐습니다. SPRING_SESSION, SPRING_SESSION_ATTRIBUTES
JPA로 인해 세션 테이블이 자동 생성되었기 때문에 별도로 해야 할 일은 없습니다.

↑ 방금 로그인했기 때문에 한 개의 세션이 등록되어있습니다.

  1. USER ROLE 을 변경해준다

  2. 로그아웃 했다가 다시 로그인 해서 글을 올려준다.

  3. 서버 종료 후 다시 켜본다.

  4. 로그인해서 글을 등록해본다.

❌ ERROR

..?

왜지..?

세션 저장소를 데이터베이스로 교체했습니다만 물론 지금은 기존과 동일하게 스프링을 재시작하면 세션이 풀립니다.

..???
이게 무슨 소립니까 선생님... 바꾸려고 하시지 않으셨나요...

이유는 h2 기반으로 스프링이 재실행될 h2도 재실행되기 때문입니다. 이후 AWS 로 배포하게 되면 AWS 의 데이터베이스 서비스인 RDS(Relational Database Service)를 사용하게 되니 이 때부터는 세션이 풀리지 않습니다.
그 기반이 되는 코드를 작성한 것이니 걱정말고 다음 과정을 진행하시면 됩니다.

아하! 감사합니다!
고생하셨습니다!

내일은 네이버 로그인을 추가해보겠습니다!

profile
BEAT A SHOTGUN

0개의 댓글