Replies: 14 comments 4 replies
-
MemberMemberControllerfindMemberInfo
updateMember
show ( admin only )
MemberRecationControllershowScrap
registerScrap
unregisterScrap
|
Beta Was this translation helpful? Give feedback.
-
StudyLog✅StudylogSessionService👉syncStudylogSession()옛날엔 Session 없이 Mission만 있었고, sturylog는 필드로 Mission을 필수적으로 가지고 있었음. 나중에 Session을 필드로 추가하게 되면서, Mission이 가진 Session 정보를 가지고 와서 studylog의 Session을 자동으로 셋팅하기 위해 구현됨. ✅ViewedStudyLogCookieGeneratorTest👉generateCookie()쿠키 헤더에 viewd 값을 추가하여 반환하는 메서드 👉isViewed()입력받은 String studyLogIds가 "/studyId/"의 형식인지 여부를 반환하는 메서드 👉setViewedStudyLogCookie()입력받은 String studyLogIds가 "/studyId/"의 형식이라면(isViewed()==true), 해당 정보를 기반으로 쿠키를 생성하고 response 객체의 header에 추가하는 메서드 ✅StudylogService👉findStudylogByIdid 기반으로 해당 studylog 가 없을 경우 👉retrieveStudylogByIdStudylog 를 검색하는 전체 플로우를 담당하는 메서드
👉deleteStudylog유저의 아이디와 스터디로그의 아이디를 받아온다.
👉updateStudyMission
👉findStudylogs스터디 로그에 대한 검색을 진행한다.
✅ StudylogTagService👉findAll저장된 모든 StudylogTag를 찾습니다. ###👉findTagsIncludedInStudylogs ✅TagService👉findOrCreate요청들에서 포함된 tag들을 찾고, 요청중에서 이미 디비에 저장되지 않은 Tag가 있다면 👉findTagsIncludedInStudylogsstudylog에서 사용되는 tag들을 조회하고, 중복을 제거 후 이름순으로 정렬해서 반환한다. |
Beta Was this translation helpful? Give feedback.
-
Member, GroupMember(이하 GM), MemberGroup(이하 MG) 관계Member : GM = 1 : N MG => 그룹, GM => 멤버와 그룹간의 맵핑 테이블 |
Beta Was this translation helpful? Give feedback.
-
https://wandering-niece-921.notion.site/1afb445baea0488e991495e68be59ee4 |
Beta Was this translation helpful? Give feedback.
-
MissionSessionMissionService#findAllWithMyMissionFirst SessionMemberService�SessionMember는 다대다 관계인 Member와 Session 을 풀어내기 위한 맵핑 테이블 SessionService#findAllWithMySessionFirst |
Beta Was this translation helpful? Give feedback.
-
Memberhttps://chocolate-innovation-7ff.notion.site/Member-e19a6361d23c4c37a0805df3dec00f1b |
Beta Was this translation helpful? Give feedback.
-
Beta Was this translation helpful? Give feedback.
-
updateMemberTagApplicationListeneronApplicationEvent(ContextRefreshedEvent event)
|
Beta Was this translation helpful? Give feedback.
-
Badgehttps://chocolate-innovation-7ff.notion.site/Badge-0971882182cb4088a1bb5ee6c9435fbd |
Beta Was this translation helpful? Give feedback.
-
GithubLogServiceSpring(Java)에서 Github 소셜 로그인을 구현하기 위해 알아둬야 할 인증 흐름은 다음과 같다.
4번 단계부터가 서버에서 처리하는 동작이다. 현재(2023-05-26) 기준 GithubLogService 클래스에 작성되어 있는 createToken() 메서드는 다음과 같다. private final GithubClient githubClient;
...
public TokenResponse createToken(TokenRequest tokenRequest) {
String githubAccessToken = githubClient.getAccessTokenFromGithub(tokenRequest.getCode());
GithubProfileResponse githubProfile = githubClient
.getGithubProfileFromGithub(githubAccessToken);
Member member = memberService.findOrCreateMember(githubProfile);
String accessToken = jwtTokenProvider.createToken(member);
return TokenResponse.of(accessToken);
} GithubClient 클래스에 구현되어 있는
이제 각 메서드의 상세 동작 메커니즘을 살펴보자. 4. 받은 code를 이용해서
|
Beta Was this translation helpful? Give feedback.
-
/**
* 최상위 키워드를 만드는 경우, 키워드의 부모 값에 null을 넣어줌
*/
public Long createKeyword(final Long sessionId, final KeywordCreateRequest request) {
existSession(sessionId);
Keyword keywordParent = findKeywordParentOrNull(request.getParentKeywordId());
Keyword keyword = request.toEntity(sessionId, keywordParent);
keywordRepository.save(keyword);
return keyword.getId();
} createKeyword: 최상위 키워드를 생성한다. 요청으로부터 받은 세션 ID와 키워드 생성 요청 정보를 사용하여 키워드 엔티티를 생성하고 저장한다. 부모 키워드 ID가 제공된 경우 해당 키워드를 찾아 부모로 설정한다. @Transactional(readOnly = true)
public KeywordResponse findKeyword(final Long sessionId, final Long keywordId) {
existSession(sessionId);
Keyword keyword = keywordRepository.findById(keywordId)
.orElseThrow(KeywordNotFoundException::new);
return KeywordResponse.createResponse(keyword);
} findKeyword: 특정 키워드 ID를 사용하여 키워드를 조회한다. 요청으로부터 받은 세션 ID와 키워드 ID를 사용하여 키워드를 검색하고, 해당 키워드의 정보를 KeywordResponse 객체로 반환한다. @Transactional(readOnly = true)
public KeywordResponse findKeywordWithAllChild(final Long sessionId, final Long keywordId) {
existSession(sessionId);
existKeyword(keywordId);
Keyword keyword = keywordRepository.findFetchById(keywordId);
return KeywordResponse.createWithAllChildResponse(keyword);
} findKeywordWithAllChild: 특정 키워드 ID를 사용하여 해당 키워드와 모든 하위 키워드를 조회한다. 요청으로부터 받은 세션 ID와 키워드 ID를 사용하여 키워드를 검색하고, 해당 키워드와 모든 하위 키워드의 정보를 KeywordResponse 객체로 반환한다. @Transactional(readOnly = true)
public KeywordsResponse findSessionIncludeRootKeywords(final Long sessionId) {
existSession(sessionId);
List<Keyword> keywords = keywordRepository.findBySessionIdAndParentIsNull(sessionId);
return KeywordsResponse.createResponse(keywords);
} findSessionIncludeRootKeywords: 세션에 속한 최상위 키워드들을 조회한다. 요청으로부터 받은 세션 ID를 사용하여 세션에 속한 최상위 키워드들을 검색하고, 해당 키워드들의 정보를 KeywordsResponse 객체로 반환한다. public void updateKeyword(final Long sessionId, final Long keywordId,
final KeywordUpdateRequest request) {
existSession(sessionId); // 세션이 없다면 예외가 발생
Keyword keyword = keywordRepository.findById(keywordId)
.orElseThrow(KeywordNotFoundException::new); // keyword 가 없다면 예외를 발생
Keyword keywordParent = findKeywordParentOrNull(request.getParentKeywordId());
keyword.update(request.getName(), request.getDescription(), request.getOrder(),
request.getImportance(), keywordParent);
} updateKeyword: 특정 키워드를 업데인트한다. 요청으로부터 받은 세션 ID와 키워드 ID를 사용하여 키워드를 검색하고, 요청으로 받은 정보를 사용하여 키워드의 속성을 업데이트한다. 부모 키워드 ID가 제공된 경우 해당 키워드를 찾아 부모로 설정한다. public void deleteKeyword(final Long sessionId, final Long keywordId) {
existSession(sessionId);
Keyword keyword = keywordRepository.findFetchById(keywordId);
keywordRepository.delete(keyword);
} deleteKeyword: 특정 키워드를 삭제한다. 요청으로부터 받은 세션 ID와 키워드 ID를 사용하여 키워드를 검색하고, 키워드를 삭제한다. private void existSession(final Long sessionId) {
boolean exists = sessionRepository.existsById(sessionId);
if (!exists) {
throw new SessionNotFoundException();
}
} existSession: 주어진 세션 ID로 세션이 존재하는지 확인한다. 세션이 존재하지 않으면 SessionNotFoundException을 발생시킨다. private void existKeyword(final Long keywordId) {
boolean exists = keywordRepository.existsById(keywordId);
if (!exists) {
throw new KeywordNotFoundException();
}
} existKeyword: 주어진 키워드 ID로 키워드가 존재하는지 확인한다. 키워드가 존재하지 않으면 KeywordNotFoundException을 발생시킨다. private Keyword findKeywordParentOrNull(final Long keywordId) {
if (keywordId == null) {
return null;
}
return keywordRepository.findById(keywordId).orElseThrow(KeywordNotFoundException::new);
} findKeywordParentOrNull: 주어진 키워드 ID로 키워드를 검색하여 반환한다. 키워드 ID가 null인 경우 null을 반환다. 키워드가 존재하지 않으면 KeywordNotFoundException을 발생시킨다. |
Beta Was this translation helpful? Give feedback.
-
Beta Was this translation helpful? Give feedback.
-
LOGINLoginInterceptorgithubLoginService.validateToken(AuthorizationExtractor.extract(request));
AuthMemberPrincipalArgumentResolverString credentials = AuthorizationExtractor
.extract(webRequest.getNativeRequest(HttpServletRequest.class));
if (credentials == null || credentials.isEmpty()) {
memberAuthorityCache.setAuthority(Authority.ANONYMOUS);
return new LoginMember(Authority.ANONYMOUS);
}
try {
Long id = Long.parseLong(jwtTokenProvider.extractSubject(credentials));
memberAuthorityCache.setAuthority(Authority.MEMBER);
return new LoginMember(id, Authority.MEMBER);
} catch (NumberFormatException e) {
throw new TokenNotValidException();
} 회원인 사용자에 대한 검증을 진행한다.
MemberAuthorityCache@Component
@RequestScope
public class MemberAuthorityCache {
private Authority authority;
public Authority getAuthority() {
return authority;
}
public void setAuthority(Authority authority) {
this.authority = authority;
}
}
MemberOnly@Aspect
@Component
@RequiredArgsConstructor
public class LoginMemberVerifier {
private final MemberAuthorityCache memberAuthorityCache;
@Before("@annotation(wooteco.prolog.login.aop.MemberOnly)")
public void checkLoginMember() {
final Authority authority = memberAuthorityCache.getAuthority();
if (!authority.equals(Authority.MEMBER)) {
throw new MemberNotAllowedException();
}
}
}
예를들어 @PutMapping("/{id}")
@MemberOnly
public ResponseEntity<Void> updateLovellog(@AuthMemberPrincipal LoginMember member,
@PathVariable Long id,
@RequestBody LevelLogRequest levelLogRequest) {
levelLogService.updateLevelLog(member.getId(), id, levelLogRequest);
return ResponseEntity.noContent().build();
}
원래 있던 위키에도 잘 정리가 되어있습니다! |
Beta Was this translation helpful? Give feedback.
-
작성 방법
쓰레드 예시
Beta Was this translation helpful? Give feedback.
All reactions