diff --git a/src/main/java/org/tuna/zoopzoop/backend/domain/auth/handler/OAuth2SuccessHandler.java b/src/main/java/org/tuna/zoopzoop/backend/domain/auth/handler/OAuth2SuccessHandler.java index 69b834a2..665a44fe 100644 --- a/src/main/java/org/tuna/zoopzoop/backend/domain/auth/handler/OAuth2SuccessHandler.java +++ b/src/main/java/org/tuna/zoopzoop/backend/domain/auth/handler/OAuth2SuccessHandler.java @@ -97,8 +97,34 @@ public void onAuthenticationSuccess(HttpServletRequest request, HttpServletRespo } } + if ("dev".equalsIgnoreCase(activeProfile)) { + // 로컬 테스트용. profile이 dev인 경우. + ResponseCookie accessCookie = ResponseCookie.from("accessToken", accessToken) + .httpOnly(true) + .path("/") + .maxAge(jwtProperties.getAccessTokenValidity() / 1000) + .secure(false) + .sameSite("Lax") + .build(); + + ResponseCookie sessionCookie = ResponseCookie.from("sessionId", sessionId) + .httpOnly(true) + .path("/") + .maxAge(jwtProperties.getRefreshTokenValidity() / 1000) // RefreshToken 유효기간과 동일하게 + .secure(false) + .sameSite("Lax") + .build(); + + response.addHeader(HttpHeaders.SET_COOKIE, accessCookie.toString()); + response.addHeader(HttpHeaders.SET_COOKIE, sessionCookie.toString()); + + response.sendRedirect("http://localhost:8080"); + return; + } + if ("http://localhost:3000".equals(redirect_domain)) { // server 환경일 때: URL 파라미터로 토큰 전달 + // 프론트엔드 local 테스트용. String redirectUrl = redirect_domain + "/api/auth/callback" + "?success=true" + "&accessToken=" + URLEncoder.encode(accessToken, "UTF-8") diff --git a/src/main/java/org/tuna/zoopzoop/backend/domain/member/dto/res/ResBodyForSearchMember.java b/src/main/java/org/tuna/zoopzoop/backend/domain/member/dto/res/ResBodyForSearchMember.java index ce0af15c..400cc180 100644 --- a/src/main/java/org/tuna/zoopzoop/backend/domain/member/dto/res/ResBodyForSearchMember.java +++ b/src/main/java/org/tuna/zoopzoop/backend/domain/member/dto/res/ResBodyForSearchMember.java @@ -13,6 +13,6 @@ public ResBodyForSearchMember(int id, String name, String profileImageUrl) { this.profileImageUrl = profileImageUrl; } public ResBodyForSearchMember(MemberDocument memberDocument){ - this(memberDocument.getId(), memberDocument.getName(), memberDocument.getProfileImageUrl()); + this(memberDocument.getId(), memberDocument.getNameWithTag(), memberDocument.getProfileImageUrl()); } } \ No newline at end of file diff --git a/src/main/java/org/tuna/zoopzoop/backend/domain/member/entity/MemberDocument.java b/src/main/java/org/tuna/zoopzoop/backend/domain/member/entity/MemberDocument.java index a0b80c9b..2b5e19ca 100644 --- a/src/main/java/org/tuna/zoopzoop/backend/domain/member/entity/MemberDocument.java +++ b/src/main/java/org/tuna/zoopzoop/backend/domain/member/entity/MemberDocument.java @@ -16,8 +16,9 @@ public class MemberDocument { @Id private int id; - @Field(type = FieldType.Text, analyzer = "ngram_analyzer", searchAnalyzer = "standard") - private String name; + @Field(type = FieldType.Text, analyzer = "ngram_analyzer", searchAnalyzer = "ngram_analyzer") + private String nameOnly; + private String nameWithTag; private String profileImageUrl; -} +} \ No newline at end of file diff --git a/src/main/java/org/tuna/zoopzoop/backend/domain/member/repository/MemberSearchRepository.java b/src/main/java/org/tuna/zoopzoop/backend/domain/member/repository/MemberSearchRepository.java index 5278c300..07482f4e 100644 --- a/src/main/java/org/tuna/zoopzoop/backend/domain/member/repository/MemberSearchRepository.java +++ b/src/main/java/org/tuna/zoopzoop/backend/domain/member/repository/MemberSearchRepository.java @@ -6,5 +6,6 @@ import java.util.List; public interface MemberSearchRepository extends ElasticsearchRepository { - List findByNameContaining(String name); + List findByNameOnlyContaining(String name); + List findByNameOnly(String name); } diff --git a/src/main/java/org/tuna/zoopzoop/backend/domain/member/service/MemberSearchService.java b/src/main/java/org/tuna/zoopzoop/backend/domain/member/service/MemberSearchService.java index 049c9751..4c7de5a3 100644 --- a/src/main/java/org/tuna/zoopzoop/backend/domain/member/service/MemberSearchService.java +++ b/src/main/java/org/tuna/zoopzoop/backend/domain/member/service/MemberSearchService.java @@ -13,6 +13,6 @@ public class MemberSearchService { private final MemberSearchRepository memberSearchRepository; public List searchByName(String name) { - return memberSearchRepository.findByNameContaining(name); + return memberSearchRepository.findByNameOnly(name); } } diff --git a/src/main/java/org/tuna/zoopzoop/backend/domain/member/service/MemberService.java b/src/main/java/org/tuna/zoopzoop/backend/domain/member/service/MemberService.java index ec4fd4fb..a89a5429 100644 --- a/src/main/java/org/tuna/zoopzoop/backend/domain/member/service/MemberService.java +++ b/src/main/java/org/tuna/zoopzoop/backend/domain/member/service/MemberService.java @@ -90,12 +90,7 @@ public Member createMember(String name, String profileUrl, String key, Provider Member saved = memberRepository.save(member); // ElasticSearch용 document 생성. - MemberDocument doc = new MemberDocument(); - doc.setId(saved.getId()); - doc.setName(saved.getName()); - doc.setProfileImageUrl(saved.getProfileImageUrl()); - memberSearchRepository.save(doc); - + createDocument(member); return saved; } @@ -108,11 +103,8 @@ public void updateMemberName(Member member, String newName){ member.updateName(generateUniqueUserNameTag(newName)); memberRepository.save(member); - MemberDocument doc = new MemberDocument(); - doc.setId(member.getId()); - doc.setName(member.getName()); - doc.setProfileImageUrl(member.getProfileImageUrl()); - memberSearchRepository.save(doc); + // ElasticSearch용 document 생성. + createDocument(member); } @Transactional @@ -123,6 +115,9 @@ public void updateMemberProfileUrl(Member member, MultipartFile file){ String newUrl = s3Service.upload(file, fileName); member.updateProfileUrl(newUrl); memberRepository.save(member); + + // ElasticSearch용 document 생성. + createDocument(member); } catch (IOException e) { throw new IllegalArgumentException("잘못된 파일 입력입니다."); } @@ -140,6 +135,9 @@ public void updateMemberProfile(Member member, String newName, MultipartFile fil String newUrl = s3Service.upload(file, fileName); member.updateProfileUrl(newUrl); memberRepository.save(member); + + // ElasticSearch용 document 생성. + createDocument(member); } catch (IOException e) { throw new IllegalArgumentException("잘못된 파일 입력입니다."); } @@ -151,9 +149,16 @@ public void updateMemberProfile(Member member, String newName, MultipartFile fil @Transactional public void hardDeleteMember(Member member){ Integer memberId = member.getId(); + + // 관련 데이터 정리 tagRepository.bulkDeleteTagsByMemberId(memberId); dataSourceRepository.bulkDeleteByMemberId(memberId); + + // 회원 삭제 memberRepository.delete(member); + + // Elastic Search 인덱스에서 회원 삭제. + memberSearchRepository.deleteById(memberId); } //soft-delete한 회원 복구 @@ -168,4 +173,19 @@ private String generateUniqueUserNameTag(String baseName) { } while(memberRepository.existsByName(candidate)); return candidate; } + + // ElasticSearch용 document 생성 메소드. + private void createDocument(Member member){ + MemberDocument doc = new MemberDocument(); + doc.setId(member.getId()); + + String name = member.getName(); + String nameOnly = name.contains("#") ? name.substring(0, name.indexOf("#")) : name; + + doc.setNameOnly(nameOnly); + doc.setNameWithTag(name); + doc.setProfileImageUrl(member.getProfileImageUrl()); + + memberSearchRepository.save(doc); + } } diff --git a/src/main/resources/ngram.json b/src/main/resources/ngram.json index edac1535..e8b81ddb 100644 --- a/src/main/resources/ngram.json +++ b/src/main/resources/ngram.json @@ -2,16 +2,14 @@ "analysis": { "analyzer": { "ngram_analyzer": { - "tokenizer": "ngram_tokenizer", - "filter": ["lowercase"] + "tokenizer": "my_ngram_tokenizer" } }, "tokenizer": { - "ngram_tokenizer": { + "my_ngram_tokenizer": { "type": "ngram", - "min_gram": 2, - "max_gram": 3, - "token_chars": ["letter", "digit"] + "min_gram": 1, + "max_gram": 2 } } }