Skip to content

Commit 90bf3fe

Browse files
authored
refactor/OPS-396: n-gram analyzer 적용을 통한 검색 결과 향상 & OAuth2SuccessHandler 로컬 환경 분기. (#154)
1 parent 0bf912b commit 90bf3fe

File tree

7 files changed

+69
-23
lines changed

7 files changed

+69
-23
lines changed

src/main/java/org/tuna/zoopzoop/backend/domain/auth/handler/OAuth2SuccessHandler.java

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -97,8 +97,34 @@ public void onAuthenticationSuccess(HttpServletRequest request, HttpServletRespo
9797
}
9898
}
9999

100+
if ("dev".equalsIgnoreCase(activeProfile)) {
101+
// 로컬 테스트용. profile이 dev인 경우.
102+
ResponseCookie accessCookie = ResponseCookie.from("accessToken", accessToken)
103+
.httpOnly(true)
104+
.path("/")
105+
.maxAge(jwtProperties.getAccessTokenValidity() / 1000)
106+
.secure(false)
107+
.sameSite("Lax")
108+
.build();
109+
110+
ResponseCookie sessionCookie = ResponseCookie.from("sessionId", sessionId)
111+
.httpOnly(true)
112+
.path("/")
113+
.maxAge(jwtProperties.getRefreshTokenValidity() / 1000) // RefreshToken 유효기간과 동일하게
114+
.secure(false)
115+
.sameSite("Lax")
116+
.build();
117+
118+
response.addHeader(HttpHeaders.SET_COOKIE, accessCookie.toString());
119+
response.addHeader(HttpHeaders.SET_COOKIE, sessionCookie.toString());
120+
121+
response.sendRedirect("http://localhost:8080");
122+
return;
123+
}
124+
100125
if ("http://localhost:3000".equals(redirect_domain)) {
101126
// server 환경일 때: URL 파라미터로 토큰 전달
127+
// 프론트엔드 local 테스트용.
102128
String redirectUrl = redirect_domain + "/api/auth/callback"
103129
+ "?success=true"
104130
+ "&accessToken=" + URLEncoder.encode(accessToken, "UTF-8")

src/main/java/org/tuna/zoopzoop/backend/domain/member/dto/res/ResBodyForSearchMember.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,6 @@ public ResBodyForSearchMember(int id, String name, String profileImageUrl) {
1313
this.profileImageUrl = profileImageUrl;
1414
}
1515
public ResBodyForSearchMember(MemberDocument memberDocument){
16-
this(memberDocument.getId(), memberDocument.getName(), memberDocument.getProfileImageUrl());
16+
this(memberDocument.getId(), memberDocument.getNameWithTag(), memberDocument.getProfileImageUrl());
1717
}
1818
}

src/main/java/org/tuna/zoopzoop/backend/domain/member/entity/MemberDocument.java

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -16,8 +16,9 @@ public class MemberDocument {
1616
@Id
1717
private int id;
1818

19-
@Field(type = FieldType.Text, analyzer = "ngram_analyzer", searchAnalyzer = "standard")
20-
private String name;
19+
@Field(type = FieldType.Text, analyzer = "ngram_analyzer", searchAnalyzer = "ngram_analyzer")
20+
private String nameOnly;
2121

22+
private String nameWithTag;
2223
private String profileImageUrl;
23-
}
24+
}

src/main/java/org/tuna/zoopzoop/backend/domain/member/repository/MemberSearchRepository.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,5 +6,6 @@
66
import java.util.List;
77

88
public interface MemberSearchRepository extends ElasticsearchRepository<MemberDocument, Integer> {
9-
List<MemberDocument> findByNameContaining(String name);
9+
List<MemberDocument> findByNameOnlyContaining(String name);
10+
List<MemberDocument> findByNameOnly(String name);
1011
}

src/main/java/org/tuna/zoopzoop/backend/domain/member/service/MemberSearchService.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,6 @@ public class MemberSearchService {
1313
private final MemberSearchRepository memberSearchRepository;
1414

1515
public List<MemberDocument> searchByName(String name) {
16-
return memberSearchRepository.findByNameContaining(name);
16+
return memberSearchRepository.findByNameOnly(name);
1717
}
1818
}

src/main/java/org/tuna/zoopzoop/backend/domain/member/service/MemberService.java

Lines changed: 31 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -90,12 +90,7 @@ public Member createMember(String name, String profileUrl, String key, Provider
9090
Member saved = memberRepository.save(member);
9191

9292
// ElasticSearch용 document 생성.
93-
MemberDocument doc = new MemberDocument();
94-
doc.setId(saved.getId());
95-
doc.setName(saved.getName());
96-
doc.setProfileImageUrl(saved.getProfileImageUrl());
97-
memberSearchRepository.save(doc);
98-
93+
createDocument(member);
9994
return saved;
10095
}
10196

@@ -108,11 +103,8 @@ public void updateMemberName(Member member, String newName){
108103
member.updateName(generateUniqueUserNameTag(newName));
109104
memberRepository.save(member);
110105

111-
MemberDocument doc = new MemberDocument();
112-
doc.setId(member.getId());
113-
doc.setName(member.getName());
114-
doc.setProfileImageUrl(member.getProfileImageUrl());
115-
memberSearchRepository.save(doc);
106+
// ElasticSearch용 document 생성.
107+
createDocument(member);
116108
}
117109

118110
@Transactional
@@ -123,6 +115,9 @@ public void updateMemberProfileUrl(Member member, MultipartFile file){
123115
String newUrl = s3Service.upload(file, fileName);
124116
member.updateProfileUrl(newUrl);
125117
memberRepository.save(member);
118+
119+
// ElasticSearch용 document 생성.
120+
createDocument(member);
126121
} catch (IOException e) {
127122
throw new IllegalArgumentException("잘못된 파일 입력입니다.");
128123
}
@@ -140,6 +135,9 @@ public void updateMemberProfile(Member member, String newName, MultipartFile fil
140135
String newUrl = s3Service.upload(file, fileName);
141136
member.updateProfileUrl(newUrl);
142137
memberRepository.save(member);
138+
139+
// ElasticSearch용 document 생성.
140+
createDocument(member);
143141
} catch (IOException e) {
144142
throw new IllegalArgumentException("잘못된 파일 입력입니다.");
145143
}
@@ -151,9 +149,16 @@ public void updateMemberProfile(Member member, String newName, MultipartFile fil
151149
@Transactional
152150
public void hardDeleteMember(Member member){
153151
Integer memberId = member.getId();
152+
153+
// 관련 데이터 정리
154154
tagRepository.bulkDeleteTagsByMemberId(memberId);
155155
dataSourceRepository.bulkDeleteByMemberId(memberId);
156+
157+
// 회원 삭제
156158
memberRepository.delete(member);
159+
160+
// Elastic Search 인덱스에서 회원 삭제.
161+
memberSearchRepository.deleteById(memberId);
157162
}
158163

159164
//soft-delete한 회원 복구
@@ -168,4 +173,19 @@ private String generateUniqueUserNameTag(String baseName) {
168173
} while(memberRepository.existsByName(candidate));
169174
return candidate;
170175
}
176+
177+
// ElasticSearch용 document 생성 메소드.
178+
private void createDocument(Member member){
179+
MemberDocument doc = new MemberDocument();
180+
doc.setId(member.getId());
181+
182+
String name = member.getName();
183+
String nameOnly = name.contains("#") ? name.substring(0, name.indexOf("#")) : name;
184+
185+
doc.setNameOnly(nameOnly);
186+
doc.setNameWithTag(name);
187+
doc.setProfileImageUrl(member.getProfileImageUrl());
188+
189+
memberSearchRepository.save(doc);
190+
}
171191
}

src/main/resources/ngram.json

Lines changed: 4 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -2,16 +2,14 @@
22
"analysis": {
33
"analyzer": {
44
"ngram_analyzer": {
5-
"tokenizer": "ngram_tokenizer",
6-
"filter": ["lowercase"]
5+
"tokenizer": "my_ngram_tokenizer"
76
}
87
},
98
"tokenizer": {
10-
"ngram_tokenizer": {
9+
"my_ngram_tokenizer": {
1110
"type": "ngram",
12-
"min_gram": 2,
13-
"max_gram": 3,
14-
"token_chars": ["letter", "digit"]
11+
"min_gram": 1,
12+
"max_gram": 2
1513
}
1614
}
1715
}

0 commit comments

Comments
 (0)