Skip to content
Merged
Show file tree
Hide file tree
Changes from 10 commits
Commits
Show all changes
12 commits
Select commit Hold shift + click to select a range
f0ed32c
✨feat: 곡유 냉μž₯κ³  μ‚¬μš©μ„ μœ„ν•œ μ›Ήμ†ŒμΌ“ μ˜μ‘΄μ„± μΆ”κ°€
MODUGGAGI Dec 14, 2025
ad5a6cb
✨feat: 곡유 냉μž₯κ³  μ‚¬μš©μ„ μœ„ν•œ 냉μž₯고와 λ©€λ²„μ˜ μŠ€ν‚€λ§ˆ λ³€κ²½
MODUGGAGI Dec 14, 2025
71f9ab0
✨feat: 냉μž₯κ³  μ΄ˆλŒ€ μ—λŸ¬ μƒνƒœ μΆ”κ°€
MODUGGAGI Dec 15, 2025
5ae8701
✨feat: μ›Ήμ†ŒμΌ“ μ‚¬μš©μ„ μœ„ν•œ μ„€μ • μΆ”κ°€
MODUGGAGI Dec 15, 2025
5bf2022
✨feat: 곡유 냉μž₯κ³  μ΄ˆλŒ€λ₯Ό μœ„ν•œ κΈ°λŠ₯ μΆ”κ°€
MODUGGAGI Dec 15, 2025
b9d686f
✨feat: μ›Ήμ†ŒμΌ“μ„ ν†΅ν•œ ν”„λ‘ νŠΈμ— μƒˆλ‘œκ³ μΉ¨ μš”μ²­ 전달
MODUGGAGI Dec 15, 2025
3b63c68
✨feat: Memberλ₯Ό 고아객체 μ‚­μ œμ—μ„œ 제거
MODUGGAGI Dec 15, 2025
262caad
✨feat: μ›Ήμ†ŒμΌ“ 섀정을 μœ„ν•œ id κ°’ 전달 및 SecurityConfigμ—μ„œ 경둜 ν—ˆμš©
MODUGGAGI Dec 15, 2025
7af4e89
refactor: λ‘œκ·Έμ •λ¦¬λ¦¬
MODUGGAGI Dec 15, 2025
f965ae7
✨feat: νŒ”λ‘œμš° λͺ©λ‘ 보기
MODUGGAGI Dec 15, 2025
2e49f64
Update src/main/java/novaminds/gradproj/domain/refrigerator/service/c…
chan0831 Dec 15, 2025
9871677
Update src/main/java/novaminds/gradproj/domain/refrigerator/entity/Re…
chan0831 Dec 15, 2025
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
3 changes: 3 additions & 0 deletions build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -78,6 +78,9 @@ dependencies {
implementation 'com.google.api-client:google-api-client'
implementation 'com.google.oauth-client:google-oauth-client'
implementation 'com.google.http-client:google-http-client-gson'

// ============= WebSocket =============
implementation 'org.springframework.boot:spring-boot-starter-websocket'
}

tasks.named('test') {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -81,6 +81,14 @@ public enum ErrorStatus implements BaseErrorCode {
STORED_ITEM_NOT_FOUND(HttpStatus.NOT_FOUND, "REFRIGERATOR403", "냉μž₯κ³  재료λ₯Ό 찾을 수 μ—†μŠ΅λ‹ˆλ‹€."),
STORED_ITEM_ACCESS_DENIED(HttpStatus.FORBIDDEN, "REFRIGERATOR404", "ν•΄λ‹Ή 냉μž₯κ³  μž¬λ£Œμ— λŒ€ν•œ μ ‘κ·Ό κΆŒν•œμ΄ μ—†μŠ΅λ‹ˆλ‹€."),

// 냉μž₯κ³  μ΄ˆλŒ€ κ΄€λ ¨ μ—λŸ¬
INVITATION_NOT_FOUND(HttpStatus.NOT_FOUND, "INVITATION401", "μ΄ˆλŒ€λ₯Ό 찾을 수 μ—†μŠ΅λ‹ˆλ‹€."),
INVITATION_ALREADY_EXISTS(HttpStatus.BAD_REQUEST, "INVITATION402", "이미 μ΄ˆλŒ€λ₯Ό 보낸 μ‚¬μš©μžμž…λ‹ˆλ‹€."),
INVITATION_ALREADY_PROCESSED(HttpStatus.BAD_REQUEST, "INVITATION403", "이미 처리된 μ΄ˆλŒ€μž…λ‹ˆλ‹€."),
INVITATION_NOT_AUTHORIZED(HttpStatus.FORBIDDEN, "INVITATION404", "μ΄ˆλŒ€μ— λŒ€ν•œ κΆŒν•œμ΄ μ—†μŠ΅λ‹ˆλ‹€."),
CANNOT_INVITE_SELF(HttpStatus.BAD_REQUEST, "INVITATION405", "자기 μžμ‹ μ„ μ΄ˆλŒ€ν•  수 μ—†μŠ΅λ‹ˆλ‹€."),
ALREADY_IN_SAME_REFRIGERATOR(HttpStatus.BAD_REQUEST, "INVITATION406", "이미 같은 냉μž₯κ³ λ₯Ό μ‚¬μš© μ€‘μž…λ‹ˆλ‹€."),

//λ ˆμ‹œν”Ό κ΄€λ ¨ μ—λŸ¬
RECIPE_NOT_FOUND(HttpStatus.NOT_FOUND, "RECIPE401", "ν•΄λ‹Ή λ ˆμ‹œν”Όλ₯Ό 찾을 수 μ—†μŠ΅λ‹ˆλ‹€."),
RECIPE_NOT_AUTHORIZED(HttpStatus.FORBIDDEN, "RECIPE_402", "λ ˆμ‹œν”Ό μˆ˜μ •/μ‚­μ œ κΆŒν•œμ΄ μ—†μŠ΅λ‹ˆλ‹€."),
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -62,6 +62,7 @@ public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
"/api/auth/login/naver", //TODO : 이건 μ—†μ• κ³  ν”„λ‘ νŠΈμ—μ„œ λ°”λ‘œ 직접 μ ‘κ·Όν•˜λŠ”κ²Œ λ‚˜μ€ ꡬ쑰
"/api/auth/reset-password/**",
"/login/oauth2/**",
"/ws-stomp/**",
"/swagger-ui/**",
"/v3/api-docs/**",
"/swagger-resources/**"
Expand Down
41 changes: 41 additions & 0 deletions src/main/java/novaminds/gradproj/config/WebSocketConfig.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,41 @@
package novaminds.gradproj.config;

import lombok.RequiredArgsConstructor;
import novaminds.gradproj.global.websocket.StompHandler;
import org.springframework.context.annotation.Configuration;
import org.springframework.messaging.simp.config.ChannelRegistration;
import org.springframework.messaging.simp.config.MessageBrokerRegistry;
import org.springframework.web.socket.config.annotation.EnableWebSocketMessageBroker;
import org.springframework.web.socket.config.annotation.StompEndpointRegistry;
import org.springframework.web.socket.config.annotation.WebSocketMessageBrokerConfigurer;

@Configuration
@EnableWebSocketMessageBroker
@RequiredArgsConstructor
public class WebSocketConfig implements WebSocketMessageBrokerConfigurer {

private final StompHandler stompHandler;

@Override
public void configureMessageBroker(MessageBrokerRegistry config) {
// ꡬ독(sub) 경둜 μ„€μ •: ν΄λΌμ΄μ–ΈνŠΈκ°€ λ©”μ‹œμ§€λ₯Ό 받을 경둜의 prefix
config.enableSimpleBroker("/sub");

// λ°œν–‰(pub) 경둜 μ„€μ •: ν΄λΌμ΄μ–ΈνŠΈκ°€ λ©”μ‹œμ§€λ₯Ό 보낼 λ•Œ μ‚¬μš©ν•  prefix
config.setApplicationDestinationPrefixes("/pub");
}

@Override
public void registerStompEndpoints(StompEndpointRegistry registry) {
// μ›Ήμ†ŒμΌ“ μ—°κ²° μ£Όμ†Œ: ws://localhost:8080/ws-stomp
registry.addEndpoint("/ws-stomp")
.setAllowedOriginPatterns("*") // CORS ν—ˆμš©
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

medium

.setAllowedOriginPatterns("*")λ₯Ό μ‚¬μš©ν•˜λ©΄ λͺ¨λ“  좜처(origin)μ—μ„œμ˜ μ›Ήμ†ŒμΌ“ 연결을 ν—ˆμš©ν•˜κ²Œ λ©λ‹ˆλ‹€. 개발 μ€‘μ—λŠ” νŽΈλ¦¬ν•  수 μžˆμ§€λ§Œ, ν”„λ‘œλ•μ…˜ ν™˜κ²½μ—μ„œλŠ” λ³΄μ•ˆμƒ μœ„ν—˜ν•  수 μžˆμŠ΅λ‹ˆλ‹€. ν”„λ‘ νŠΈμ—”λ“œ μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ˜ νŠΉμ • 좜처만 ν—ˆμš©ν•˜λ„λ‘ μ œν•œν•˜μ—¬, ν—ˆκ°€λ˜μ§€ μ•Šμ€ μ›Ήμ‚¬μ΄νŠΈκ°€ μ›Ήμ†ŒμΌ“ μ—”λ“œν¬μΈνŠΈμ— μ—°κ²°ν•˜λŠ” 것을 λ°©μ§€ν•˜λŠ” 것이 μ’‹μŠ΅λ‹ˆλ‹€.

Suggested change
.setAllowedOriginPatterns("*") // CORS ν—ˆμš©
.setAllowedOriginPatterns("https://your-frontend-domain.com") // TODO: ν”„λ‘œλ•μ…˜ ν™˜κ²½μ— 맞게 도메인을 μ œν•œν•΄μ£Όμ„Έμš”.

.withSockJS();
}

@Override
public void configureClientInboundChannel(ChannelRegistration registration) {
// JWT 인증을 μœ„ν•œ 인터셉터 μΆ”κ°€
registration.interceptors(stompHandler);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -66,8 +66,9 @@ public class Member extends BaseEntity {
@Builder.Default
private Integer point = 0;

@OneToOne(mappedBy = "member", cascade = CascadeType.ALL, orphanRemoval = true)
private Refrigerator refrigerator;
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "refrigerator_id", nullable = false)
private Refrigerator refrigerator;

@OneToMany(mappedBy = "author", cascade = CascadeType.ALL, orphanRemoval = true)
@Builder.Default
Expand Down Expand Up @@ -155,17 +156,17 @@ public String getRoleKey() {
}

public void setRefrigerator(Refrigerator refrigerator) {
// κΈ°μ‘΄ 냉μž₯κ³ κ°€ 있고 μƒˆ 냉μž₯고와 λ‹€λ₯΄λ©΄ κΈ°μ‘΄ 냉μž₯고의 member μ°Έμ‘° ν•΄μ œ
// κΈ°μ‘΄ 냉μž₯κ³ κ°€ 있고 μƒˆ 냉μž₯고와 λ‹€λ₯΄λ©΄ κΈ°μ‘΄ 냉μž₯고의 memberListμ—μ„œ 제거
if (this.refrigerator != null && this.refrigerator != refrigerator) {
this.refrigerator.setMember(null);
this.refrigerator.removeMember(this);
}

// μƒˆ 냉μž₯κ³  ν• λ‹Ή
this.refrigerator = refrigerator;
// μƒˆ 냉μž₯κ³ κ°€ null이 μ•„λ‹ˆλ©΄ μ–‘λ°©ν–₯ 연관관계 μ„€μ •

// μƒˆ 냉μž₯κ³ κ°€ null이 μ•„λ‹ˆλ©΄ μ–‘λ°©ν–₯ 연관관계 μ„€μ • (memberList에 μΆ”κ°€)
if (refrigerator != null) {
refrigerator.setMember(this);
refrigerator.addMember(this);
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@
import novaminds.gradproj.domain.member.entity.Follow;
import org.springframework.data.jpa.repository.Modifying;

public interface FollowRepository extends JpaRepository<Follow, Long> {
public interface FollowRepository extends JpaRepository<Follow, Long>, FollowRepositoryCustom {
// νŠΉμ • μœ μ €'κ°€' νŒ”λ‘œμš°ν•˜λŠ” μ‚¬λžŒλ“€
List<Follow> findByFollowerLoginId(String followerLoginId);

Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
package novaminds.gradproj.domain.member.repository;

import novaminds.gradproj.domain.member.entity.Follow;

import java.util.List;

public interface FollowRepositoryCustom {

// νŒ”λ‘œμ›Œ λͺ©λ‘ 쑰회 (N+1 λ°©μ§€λ₯Ό μœ„ν•œ fetch join)
List<Follow> findFollowersWithMemberByLoginId(String loginId);

// νŒ”λ‘œμž‰ λͺ©λ‘ 쑰회 (N+1 λ°©μ§€λ₯Ό μœ„ν•œ fetch join)
List<Follow> findFollowingsWithMemberByLoginId(String loginId);
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
package novaminds.gradproj.domain.member.repository;

import com.querydsl.jpa.impl.JPAQueryFactory;
import lombok.RequiredArgsConstructor;
import novaminds.gradproj.domain.member.entity.Follow;
import org.springframework.stereotype.Repository;

import java.util.List;

import static novaminds.gradproj.domain.member.entity.QFollow.follow;
import static novaminds.gradproj.domain.member.entity.QMember.member;
import static novaminds.gradproj.domain.refrigerator.entity.QRefrigerator.refrigerator;

@Repository
@RequiredArgsConstructor
public class FollowRepositoryCustomImpl implements FollowRepositoryCustom {

private final JPAQueryFactory queryFactory;

@Override
public List<Follow> findFollowersWithMemberByLoginId(String loginId) {
return queryFactory
.selectFrom(follow)
.join(follow.follower, member).fetchJoin()
.join(member.refrigerator, refrigerator).fetchJoin()
.where(follow.following.loginId.eq(loginId))
.fetch();
}

@Override
public List<Follow> findFollowingsWithMemberByLoginId(String loginId) {
return queryFactory
.selectFrom(follow)
.join(follow.following, member).fetchJoin()
.join(member.refrigerator, refrigerator).fetchJoin()
.where(follow.follower.loginId.eq(loginId))
.fetch();
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,6 @@
import novaminds.gradproj.domain.refrigerator.entity.MemberRefrigeratorSkin;
import novaminds.gradproj.domain.refrigerator.repository.MemberRefrigeratorSkinRepository;
import novaminds.gradproj.domain.refrigerator.entity.RefrigeratorSkin;
import novaminds.gradproj.domain.refrigerator.repository.RefrigeratorRepository;
import novaminds.gradproj.domain.refrigerator.repository.RefrigeratorSkinRepository;
import novaminds.gradproj.domain.refrigerator.service.command.RefrigeratorCommandService;
import org.springframework.stereotype.Service;
Expand All @@ -18,7 +17,6 @@
@Transactional(readOnly = true)
public class MemberOnboardingService {

private final RefrigeratorRepository refrigeratorRepository;
private final RefrigeratorSkinRepository refrigeratorSkinRepository;
private final MemberRefrigeratorSkinRepository memberRefrigeratorSkinRepository;
private final RefrigeratorCommandService refrigeratorCommandService;
Expand All @@ -30,7 +28,7 @@ public class MemberOnboardingService {
*/
@Transactional
public void setupDefaultResources(Member member) {
if (refrigeratorRepository.existsByMember(member)) {
if (member.getRefrigerator() != null) {
return;
}

Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,172 @@
package novaminds.gradproj.domain.member.service.query;

import lombok.RequiredArgsConstructor;
import novaminds.gradproj.domain.member.entity.Follow;
import novaminds.gradproj.domain.member.entity.Member;
import novaminds.gradproj.domain.member.repository.FollowRepository;
import novaminds.gradproj.domain.member.web.dto.MemberResponseDTO;
import novaminds.gradproj.domain.refrigerator.entity.RefrigeratorInvitation;
import novaminds.gradproj.domain.refrigerator.repository.RefrigeratorInvitationRepository;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.stream.Collectors;

@RequiredArgsConstructor
@Transactional(readOnly = true)
@Service
public class FollowQueryService {

private final FollowRepository followRepository;
private final RefrigeratorInvitationRepository refrigeratorInvitationRepository;

public MemberResponseDTO.FollowersResponse getFollowers(Member currentMember) {
// λ‚˜λ₯Ό νŒ”λ‘œμš°ν•˜λŠ” μ‚¬λžŒλ“€ 쑰회 (fetch join으둜 N+1 λ°©μ§€)
List<Follow> followers = followRepository.findFollowersWithMemberByLoginId(currentMember.getLoginId());

// λ‚΄κ°€ νŒ”λ‘œμš°ν•˜λŠ” μ‚¬λžŒλ“€μ˜ loginIdλ₯Ό Set으둜 (λ§žνŒ” ν™•μΈμš©)
Set<String> myFollowingIds = followRepository.findByFollowerLoginId(currentMember.getLoginId())
.stream()
.map(follow -> follow.getFollowing().getLoginId())
.collect(Collectors.toSet());

// λ‚˜μ˜ 냉μž₯κ³  ID
Long myRefrigeratorId = currentMember.getRefrigerator().getId();

// νŒ”λ‘œμ›Œ 멀버 리슀트
List<Member> followerMembers = followers.stream()
.map(Follow::getFollower)
.collect(Collectors.toList());

// λ‚΄κ°€ 보낸 PENDING μ΄ˆλŒ€ 쑰회 (batch)
List<RefrigeratorInvitation> pendingInvitations = refrigeratorInvitationRepository
.findByInviterAndInviteeInAndStatus(
currentMember,
followerMembers,
RefrigeratorInvitation.InvitationStatus.PENDING
);

// PENDING μ΄ˆλŒ€λ₯Ό 받은 μ‚¬λžŒλ“€μ˜ loginIdλ₯Ό Set으둜
Set<String> pendingInviteeIds = pendingInvitations.stream()
.map(invitation -> invitation.getInvitee().getLoginId())
.collect(Collectors.toSet());

// DTO λ³€ν™˜
List<MemberResponseDTO.FollowMemberInfo> followerInfos = followers.stream()
.map(follow -> {
Member followerMember = follow.getFollower();
MemberResponseDTO.FollowMemberInfo.InvitationStatus status =
determineInvitationStatus(
followerMember,
myFollowingIds,
myRefrigeratorId,
pendingInviteeIds
);

return MemberResponseDTO.FollowMemberInfo.builder()
.nickname(followerMember.getNickname())
.profileImgUrl(followerMember.getProfileImage())
.invitationStatus(status)
.build();
})
.collect(Collectors.toList());

return MemberResponseDTO.FollowersResponse.builder()
.followers(followerInfos)
.build();
}

public MemberResponseDTO.FollowingsResponse getFollowings(Member currentMember) {
// λ‚΄κ°€ νŒ”λ‘œμš°ν•˜λŠ” μ‚¬λžŒλ“€ 쑰회 (fetch join으둜 N+1 λ°©μ§€)
List<Follow> followings = followRepository.findFollowingsWithMemberByLoginId(currentMember.getLoginId());

// λ‚˜λ₯Ό νŒ”λ‘œμš°ν•˜λŠ” μ‚¬λžŒλ“€μ˜ loginIdλ₯Ό Set으둜 (λ§žνŒ” ν™•μΈμš©)
Set<String> myFollowerIds = followRepository.findByFollowingLoginId(currentMember.getLoginId())
.stream()
.map(follow -> follow.getFollower().getLoginId())
.collect(Collectors.toSet());

// λ‚˜μ˜ 냉μž₯κ³  ID
Long myRefrigeratorId = currentMember.getRefrigerator().getId();

// νŒ”λ‘œμž‰ 멀버 리슀트
List<Member> followingMembers = followings.stream()
.map(Follow::getFollowing)
.collect(Collectors.toList());

// λ‚΄κ°€ 보낸 PENDING μ΄ˆλŒ€ 쑰회 (batch)
List<RefrigeratorInvitation> pendingInvitations = refrigeratorInvitationRepository
.findByInviterAndInviteeInAndStatus(
currentMember,
followingMembers,
RefrigeratorInvitation.InvitationStatus.PENDING
);

// PENDING μ΄ˆλŒ€λ₯Ό 받은 μ‚¬λžŒλ“€μ˜ loginIdλ₯Ό Set으둜
Set<String> pendingInviteeIds = pendingInvitations.stream()
.map(invitation -> invitation.getInvitee().getLoginId())
.collect(Collectors.toSet());

// DTO λ³€ν™˜
List<MemberResponseDTO.FollowMemberInfo> followingInfos = followings.stream()
.map(follow -> {
Member followingMember = follow.getFollowing();
MemberResponseDTO.FollowMemberInfo.InvitationStatus status =
determineInvitationStatus(
followingMember,
myFollowerIds,
myRefrigeratorId,
pendingInviteeIds
);

return MemberResponseDTO.FollowMemberInfo.builder()
.nickname(followingMember.getNickname())
.profileImgUrl(followingMember.getProfileImage())
.invitationStatus(status)
.build();
})
.collect(Collectors.toList());

return MemberResponseDTO.FollowingsResponse.builder()
.followings(followingInfos)
.build();
}

/**
* μ΄ˆλŒ€ μƒνƒœλ₯Ό κ²°μ •ν•˜λŠ” λ©”μ„œλ“œ
*
* @param targetMember λŒ€μƒ 멀버
* @param mutualCheckSet λ§žνŒ” 확인을 μœ„ν•œ Set (νŒ”λ‘œμ›Œ λͺ©λ‘μ΄λ©΄ λ‚΄ νŒ”λ‘œμž‰ Set, νŒ”λ‘œμž‰ λͺ©λ‘μ΄λ©΄ λ‚΄ νŒ”λ‘œμ›Œ Set)
* @param myRefrigeratorId λ‚˜μ˜ 냉μž₯κ³  ID
* @param pendingInviteeIds PENDING μƒνƒœ μ΄ˆλŒ€λ₯Ό 받은 μ‚¬λžŒλ“€μ˜ loginId Set
* @return InvitationStatus
*/
private MemberResponseDTO.FollowMemberInfo.InvitationStatus determineInvitationStatus(
Member targetMember,
Set<String> mutualCheckSet,
Long myRefrigeratorId,
Set<String> pendingInviteeIds
) {
// λ§žνŒ”μ΄ μ•„λ‹ˆλ©΄ NOT_MUTUAL
if (!mutualCheckSet.contains(targetMember.getLoginId())) {
return MemberResponseDTO.FollowMemberInfo.InvitationStatus.NOT_MUTUAL;
}

// λ§žνŒ”μ΄λ©΄ μΆ”κ°€ 쑰건 확인
// 1. 같은 냉μž₯κ³  μ‚¬μš© 쀑인지 확인
if (targetMember.getRefrigerator().getId().equals(myRefrigeratorId)) {
return MemberResponseDTO.FollowMemberInfo.InvitationStatus.ALREADY_SAME_REFRIGERATOR;
}

// 2. 이미 μ΄ˆλŒ€μž₯ λ³΄λƒˆλŠ”μ§€ 확인
if (pendingInviteeIds.contains(targetMember.getLoginId())) {
return MemberResponseDTO.FollowMemberInfo.InvitationStatus.INVITATION_PENDING;
}

// 3. λ‘˜ λ‹€ μ•„λ‹ˆλ©΄ μ΄ˆλŒ€ κ°€λŠ₯
return MemberResponseDTO.FollowMemberInfo.InvitationStatus.MUTUAL_FOLLOW_INVITE;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,7 @@ public class ProfileCompletionFilter extends OncePerRequestFilter {
"/api/auth/additional-info-part2",
"/api/auth/check-email",
"/api/s3/image/upload-url",
"/ws-stomp/**",
"/swagger-ui/**",
"/v3/api-docs/**"
);
Expand Down
Loading