Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@

import com.sofa.linkiving.domain.member.dto.request.LoginReq;
import com.sofa.linkiving.domain.member.dto.request.SignupReq;
import com.sofa.linkiving.domain.member.dto.response.MemberProfileRes;
import com.sofa.linkiving.domain.member.dto.response.TokenRes;
import com.sofa.linkiving.domain.member.entity.Member;
import com.sofa.linkiving.global.common.BaseResponse;
Expand All @@ -21,4 +22,7 @@ public interface MemberApi {

@Operation(summary = "로그아웃", description = "리프레시 토큰을 무효화하고 로그아웃 처리합니다.")
BaseResponse<String> logout(Member member, HttpServletRequest request, HttpServletResponse response);

@Operation(summary = "내 프로필 조회", description = "로그인한 사용자의 프로필 정보를 조회합니다.")
BaseResponse<MemberProfileRes> getProfile(Member member);
}
Original file line number Diff line number Diff line change
Expand Up @@ -3,13 +3,15 @@
import org.springframework.http.HttpHeaders;
import org.springframework.http.ResponseCookie;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import com.sofa.linkiving.domain.member.dto.request.LoginReq;
import com.sofa.linkiving.domain.member.dto.request.SignupReq;
import com.sofa.linkiving.domain.member.dto.response.MemberProfileRes;
import com.sofa.linkiving.domain.member.dto.response.TokenRes;
import com.sofa.linkiving.domain.member.entity.Member;
import com.sofa.linkiving.domain.member.service.MemberService;
Expand Down Expand Up @@ -66,4 +68,11 @@ private void expireCookie(HttpServletRequest request, HttpServletResponse respon
.build();
response.addHeader(HttpHeaders.SET_COOKIE, cookie.toString());
}

@Override
@GetMapping("/me")
public BaseResponse<MemberProfileRes> getProfile(@AuthMember Member member) {
MemberProfileRes profile = memberService.getProfile(member);
return BaseResponse.success(profile, "프로필 조회에 성공하였습니다.");
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
package com.sofa.linkiving.domain.member.dto.response;

import java.time.LocalDateTime;

import com.sofa.linkiving.domain.member.entity.Member;

import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Builder;

@Builder
public record MemberProfileRes(
@Schema(description = "회원 ID", example = "1")
Long id,
@Schema(description = "이메일", example = "user@example.com")
String email,
@Schema(description = "가입일", example = "2026-03-01T12:34:56")
LocalDateTime createdAt
) {
public static MemberProfileRes from(Member member) {
return MemberProfileRes.builder()
.id(member.getId())
.email(member.getEmail())
.createdAt(member.getCreatedAt())
.build();
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@

import com.sofa.linkiving.domain.member.dto.request.LoginReq;
import com.sofa.linkiving.domain.member.dto.request.SignupReq;
import com.sofa.linkiving.domain.member.dto.response.MemberProfileRes;
import com.sofa.linkiving.domain.member.dto.response.TokenRes;
import com.sofa.linkiving.domain.member.entity.Member;
import com.sofa.linkiving.domain.member.error.MemberErrorCode;
Expand Down Expand Up @@ -66,4 +67,9 @@ public TokenRes login(LoginReq req) {
public void logout(Member member) {
redisService.delete(RedisKeyRegistry.REFRESH_TOKEN, member.getEmail());
}

@Transactional(readOnly = true)
public MemberProfileRes getProfile(Member member) {
return MemberProfileRes.from(member);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -38,7 +38,6 @@ public class MessageQueryServiceTest {
@Mock
private Chat chat;


@Test
@DisplayName("요청 개수 초과 데이터가 존재 시 hasNext=true 반환 및 데이터를 잘라서 반환: (요청 개수 :10개 ,데이터 :11개)")
void shouldReturnHasNextTrueWhenMoreDataExists() {
Expand Down
Original file line number Diff line number Diff line change
@@ -1,11 +1,14 @@
package com.sofa.linkiving.domain.member.service;

import static org.assertj.core.api.Assertions.*;
import static org.assertj.core.api.Assertions.assertThat;
import static org.assertj.core.api.AssertionsForClassTypes.*;
import static org.assertj.core.api.AssertionsForClassTypes.assertThatThrownBy;
import static org.mockito.ArgumentMatchers.*;
import static org.mockito.BDDMockito.*;

import java.nio.charset.StandardCharsets;
import java.time.LocalDateTime;
import java.util.Base64;

import org.assertj.core.api.AssertionsForClassTypes;
Expand All @@ -19,6 +22,7 @@

import com.sofa.linkiving.domain.member.dto.request.LoginReq;
import com.sofa.linkiving.domain.member.dto.request.SignupReq;
import com.sofa.linkiving.domain.member.dto.response.MemberProfileRes;
import com.sofa.linkiving.domain.member.dto.response.TokenRes;
import com.sofa.linkiving.domain.member.entity.Member;
import com.sofa.linkiving.domain.member.error.MemberErrorCode;
Expand Down Expand Up @@ -159,4 +163,23 @@ void shouldDeleteRefreshTokenOnLogout() {
// then
verify(redisService, times(1)).delete(any(), eq(member.getEmail()));
}

@Test
@DisplayName("프로필 조회 시 회원 정보를 응답으로 변환")
void shouldReturnProfileFromMember() {
// given
Member member = mock(Member.class);
LocalDateTime createdAt = LocalDateTime.of(2026, 3, 1, 12, 34, 56);
given(member.getId()).willReturn(1L);
given(member.getEmail()).willReturn("user@example.com");
given(member.getCreatedAt()).willReturn(createdAt);

// when
MemberProfileRes res = memberService.getProfile(member);

// then
assertThat(res.id()).isEqualTo(1L);
assertThat(res.email()).isEqualTo("user@example.com");
assertThat(res.createdAt()).isEqualTo(createdAt);
}
}