Skip to content

Commit

Permalink
Merge pull request #90 from U2DJ2/be/refactor/login
Browse files Browse the repository at this point in the history
[BE] refactor : 로그인 유지 여부 추가
  • Loading branch information
jerry3269 authored May 2, 2024
2 parents a70cfe5 + d9f71b0 commit a2b44f3
Show file tree
Hide file tree
Showing 6 changed files with 85 additions and 22 deletions.
20 changes: 18 additions & 2 deletions backend/src/main/java/moim_today/domain/member/MemberSession.java
Original file line number Diff line number Diff line change
@@ -1,11 +1,16 @@
package moim_today.domain.member;

import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpSession;
import lombok.Builder;
import moim_today.global.error.InternalServerException;
import moim_today.persistence.entity.member.MemberJpaEntity;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;

import static moim_today.global.constant.MemberSessionConstant.MEMBER_SESSION;
import static moim_today.global.constant.NumberConstant.ONE_DAYS_IN_SECONDS;
import static moim_today.global.constant.NumberConstant.THIRTY_DAYS_IN_SECONDS;
import static moim_today.global.constant.exception.SessionExceptionConstant.MEMBER_SESSION_JSON_PROCESSING_ERROR;

@Builder
Expand Down Expand Up @@ -34,4 +39,15 @@ public String toJson(final ObjectMapper objectMapper) {
throw new InternalServerException(MEMBER_SESSION_JSON_PROCESSING_ERROR.message());
}
}

public void setSession(final HttpServletRequest request, final String memberSessionJson, final boolean isKeepLogin) {
HttpSession session = request.getSession(true);
session.setAttribute(MEMBER_SESSION.value(), memberSessionJson);

if (isKeepLogin) {
session.setMaxInactiveInterval(THIRTY_DAYS_IN_SECONDS.value());
} else {
session.setMaxInactiveInterval(ONE_DAYS_IN_SECONDS.value());
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@

public record MemberLoginRequest(
String email,
String password
String password,
boolean isKeepLogin
) {
}
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,9 @@ public enum NumberConstant {
EVERYTIME_ITEM_START_INDEX(0),
EVERYTIME_NODE_START_INDEX(0),

NOT_EXIST_IDX(-1);
NOT_EXIST_IDX(-1),
THIRTY_DAYS_IN_SECONDS(2592000),
ONE_DAYS_IN_SECONDS(3600);

private final int value;

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,8 @@
import org.springframework.transaction.annotation.Transactional;

import static moim_today.global.constant.MemberSessionConstant.MEMBER_SESSION;
import static moim_today.global.constant.NumberConstant.ONE_DAYS_IN_SECONDS;
import static moim_today.global.constant.NumberConstant.THIRTY_DAYS_IN_SECONDS;
import static moim_today.global.constant.exception.MemberExceptionConstant.EMAIL_PASSWORD_ERROR;

@Implement
Expand All @@ -37,7 +39,9 @@ public void login(final MemberLoginRequest memberLoginRequest,
MemberJpaEntity memberJpaEntity = memberRepository.getByEmail(memberLoginRequest.email());

if (passwordEncoder.matches(memberLoginRequest.password(), memberJpaEntity.getPassword())) {
setSessionByMemberSession(memberJpaEntity, request);
MemberSession memberSession = MemberSession.from(memberJpaEntity);
String memberSessionJson = memberSession.toJson(objectMapper);
memberSession.setSession(request, memberSessionJson, memberLoginRequest.isKeepLogin());
return;
}
throw new NotFoundException(EMAIL_PASSWORD_ERROR.message());
Expand All @@ -53,14 +57,9 @@ public void logout(final HttpServletRequest request) {
public void signUp(final MemberRegisterRequest memberRegisterRequest, final HttpServletRequest request) {
String encodedPassword = passwordEncode(memberRegisterRequest.password());
MemberJpaEntity saveMember = memberRepository.save(memberRegisterRequest.toEntity(encodedPassword));
setSessionByMemberSession(saveMember, request);
}

private void setSessionByMemberSession(final MemberJpaEntity memberJpaEntity, final HttpServletRequest request){
MemberSession memberSession = MemberSession.from(memberJpaEntity);
MemberSession memberSession = MemberSession.from(saveMember);
String memberSessionJson = memberSession.toJson(objectMapper);
HttpSession session = request.getSession(true);
session.setAttribute(MEMBER_SESSION.value(), memberSessionJson);
memberSession.setSession(request, memberSessionJson, false);
}

private String passwordEncode(final String password){
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,8 @@
import java.time.LocalDate;

import static moim_today.global.constant.MemberSessionConstant.MEMBER_SESSION;
import static moim_today.global.constant.NumberConstant.ONE_DAYS_IN_SECONDS;
import static moim_today.global.constant.NumberConstant.THIRTY_DAYS_IN_SECONDS;
import static moim_today.util.TestConstant.*;
import static org.assertj.core.api.Assertions.assertThat;
import static org.assertj.core.api.Assertions.assertThatThrownBy;
Expand All @@ -35,15 +37,56 @@ void loginSuccess() {
.password(passwordEncoder.encode(PASSWORD.value())).build();

memberRepository.save(entity);
MemberLoginRequest memberLoginRequest = new MemberLoginRequest(EMAIL.value(), PASSWORD.value());
MemberLoginRequest memberLoginRequest = new MemberLoginRequest(EMAIL.value(), PASSWORD.value(), true);
MockHttpServletRequest mockHttpServletRequest = new MockHttpServletRequest();

//when
authManager.login(memberLoginRequest, mockHttpServletRequest);

//then
assertThat(mockHttpServletRequest.getSession(false)).isNotNull();
assertThat(mockHttpServletRequest.getSession(false).getAttribute(MEMBER_SESSION.value())).isNotNull();
HttpSession session = mockHttpServletRequest.getSession(false);
assert session != null;
assertThat(session.getAttribute(MEMBER_SESSION.value())).isNotNull();
}

@DisplayName("로그인 유지를 하지 않으면 세션의 값이 하루로 설정된다.")
@Test
void noKeepLoginTest() {
//given
MemberJpaEntity entity = MemberJpaEntity.builder().email(EMAIL.value())
.password(passwordEncoder.encode(PASSWORD.value())).build();

memberRepository.save(entity);
MemberLoginRequest memberLoginRequest = new MemberLoginRequest(EMAIL.value(), PASSWORD.value(), false);
MockHttpServletRequest mockHttpServletRequest = new MockHttpServletRequest();

//when
authManager.login(memberLoginRequest, mockHttpServletRequest);

//then
HttpSession session = mockHttpServletRequest.getSession(false);
assert session != null;
assertThat(session.getMaxInactiveInterval()).isEqualTo(ONE_DAYS_IN_SECONDS.value());
}

@DisplayName("로그인 유지를 선택하면 세션의 값이 한달로 설정된다.")
@Test
void keepLoginTest() {
//given
MemberJpaEntity entity = MemberJpaEntity.builder().email(EMAIL.value())
.password(passwordEncoder.encode(PASSWORD.value())).build();

memberRepository.save(entity);
MemberLoginRequest memberLoginRequest = new MemberLoginRequest(EMAIL.value(), PASSWORD.value(), true);
MockHttpServletRequest mockHttpServletRequest = new MockHttpServletRequest();

//when
authManager.login(memberLoginRequest, mockHttpServletRequest);

//then
HttpSession session = mockHttpServletRequest.getSession(false);
assert session != null;
assertThat(session.getMaxInactiveInterval()).isEqualTo(THIRTY_DAYS_IN_SECONDS.value());
}

@DisplayName("잘못된 정보가 입력되면 404 예외를 발생시킨다.")
Expand All @@ -54,7 +97,7 @@ void loginFail() {
.password(passwordEncoder.encode(PASSWORD.value())).build();

memberRepository.save(entity);
MemberLoginRequest memberLoginRequest = new MemberLoginRequest(WRONG_EMAIL.value(), WRONG_PASSWORD.value());
MemberLoginRequest memberLoginRequest = new MemberLoginRequest(WRONG_EMAIL.value(), WRONG_PASSWORD.value(), true);
MockHttpServletRequest mockHttpServletRequest = new MockHttpServletRequest();

//when && then
Expand Down
Original file line number Diff line number Diff line change
@@ -1,20 +1,20 @@
package moim_today.presentation.auth;

import com.epages.restdocs.apispec.ResourceSnippetParameters;
import moim_today.application.auth.AuthService;
import moim_today.domain.member.enums.Gender;
import moim_today.dto.auth.MemberLoginRequest;
import moim_today.dto.auth.MemberRegisterRequest;
import moim_today.fake_class.auth.FakeAuthService;
import moim_today.util.ControllerTest;
import com.epages.restdocs.apispec.ResourceSnippetParameters;
import org.junit.jupiter.api.DisplayName;
import org.junit.jupiter.api.Test;

import java.time.LocalDate;

import static moim_today.util.TestConstant.*;
import static com.epages.restdocs.apispec.MockMvcRestDocumentationWrapper.document;
import static com.epages.restdocs.apispec.ResourceDocumentation.resource;
import static moim_today.util.TestConstant.*;
import static org.springframework.http.MediaType.APPLICATION_JSON;
import static org.springframework.restdocs.mockmvc.RestDocumentationRequestBuilders.post;
import static org.springframework.restdocs.payload.JsonFieldType.*;
Expand All @@ -33,7 +33,7 @@ protected Object initController() {
@DisplayName("로그인에 성공한다.")
@Test
void loginTest() throws Exception {
MemberLoginRequest memberLoginRequest = new MemberLoginRequest(EMAIL.value(), PASSWORD.value());
MemberLoginRequest memberLoginRequest = new MemberLoginRequest(EMAIL.value(), PASSWORD.value(), true);
String json = objectMapper.writeValueAsString(memberLoginRequest);

mockMvc.perform(post("/api/login")
Expand All @@ -47,7 +47,8 @@ void loginTest() throws Exception {
.summary("로그인")
.requestFields(
fieldWithPath("email").type(STRING).description("이메일"),
fieldWithPath("password").type(STRING).description("비밀번호")
fieldWithPath("password").type(STRING).description("비밀번호"),
fieldWithPath("isKeepLogin").type(BOOLEAN).description("로그인 유지 여부 체크")
)
.build()
)
Expand All @@ -57,7 +58,7 @@ void loginTest() throws Exception {
@DisplayName("이메일/비밀번호가 틀리면 예오가 발생한다.")
@Test
void loginTestFail() throws Exception {
MemberLoginRequest memberLoginRequest = new MemberLoginRequest(WRONG_EMAIL.value(), WRONG_PASSWORD.value());
MemberLoginRequest memberLoginRequest = new MemberLoginRequest(WRONG_EMAIL.value(), WRONG_PASSWORD.value(), true);
String json = objectMapper.writeValueAsString(memberLoginRequest);

mockMvc.perform(post("/api/login")
Expand All @@ -71,7 +72,8 @@ void loginTestFail() throws Exception {
.summary("로그인")
.requestFields(
fieldWithPath("email").type(STRING).description("이메일"),
fieldWithPath("password").type(STRING).description("비밀번호")
fieldWithPath("password").type(STRING).description("비밀번호"),
fieldWithPath("isKeepLogin").type(BOOLEAN).description("로그인 유지 여부 체크")
)
.responseFields(
fieldWithPath("statusCode").type(STRING).description("상태코드"),
Expand Down

0 comments on commit a2b44f3

Please sign in to comment.