11package com .ai .lawyer .global .util ;
22
3+ import jakarta .persistence .EntityManager ;
34import org .springframework .security .core .Authentication ;
45import org .springframework .security .core .GrantedAuthority ;
56import org .springframework .security .core .context .SecurityContextHolder ;
67import org .springframework .web .server .ResponseStatusException ;
78import org .springframework .http .HttpStatus ;
89import org .springframework .stereotype .Component ;
910import org .springframework .beans .factory .annotation .Autowired ;
10- import com .ai .lawyer .domain .member .repositories .MemberRepository ;
11- import com .ai .lawyer .domain .member .repositories .OAuth2MemberRepository ;
1211import com .ai .lawyer .domain .member .entity .Member ;
1312
1413@ Component
1514public class AuthUtil {
16- private static MemberRepository memberRepository ;
17- private static OAuth2MemberRepository oauth2MemberRepository ;
15+ private static EntityManager entityManager ;
1816
1917 @ Autowired
20- public AuthUtil (MemberRepository memberRepository ) {
21- AuthUtil .memberRepository = memberRepository ;
22- }
23-
24- @ Autowired (required = false )
25- public void setOauth2MemberRepository (OAuth2MemberRepository oauth2MemberRepository ) {
26- AuthUtil .oauth2MemberRepository = oauth2MemberRepository ;
18+ public AuthUtil (EntityManager entityManager ) {
19+ AuthUtil .entityManager = entityManager ;
2720 }
2821
2922 public static Long getCurrentMemberId () {
@@ -67,37 +60,65 @@ public static String getCurrentMemberRole() {
6760 .orElse (null );
6861 }
6962
63+ /**
64+ * 현재 인증된 사용자의 로그인 타입을 가져옵니다.
65+ * @return "LOCAL" 또는 "OAUTH2", 없으면 null
66+ */
67+ public static String getCurrentLoginType () {
68+ Authentication authentication = SecurityContextHolder .getContext ().getAuthentication ();
69+ if (authentication == null || !authentication .isAuthenticated ()) {
70+ return null ;
71+ }
72+
73+ Object details = authentication .getDetails ();
74+ if (details instanceof java .util .Map ) {
75+ @ SuppressWarnings ("unchecked" )
76+ java .util .Map <String , String > detailsMap = (java .util .Map <String , String >) details ;
77+ return detailsMap .get ("loginType" );
78+ }
79+
80+ return null ;
81+ }
82+
7083 /**
7184 * memberId로 회원을 조회합니다. (Member 또는 OAuth2Member)
85+ * SecurityContext에서 현재 인증된 사용자의 loginType을 자동으로 확인하여 적절한 테이블에서 조회합니다.
7286 * OAuth2Member인 경우 Member 객체로 변환하여 반환합니다.
87+ * EntityManager를 직접 사용하여 무한 루프를 방지합니다.
7388 * @param memberId 회원 ID
7489 * @return Member 객체
7590 * @throws ResponseStatusException 회원을 찾을 수 없는 경우
7691 */
7792 public static Member getMemberOrThrow (Long memberId ) {
78- // 먼저 Member 테이블에서 조회
79- java .util .Optional <Member > member = memberRepository .findById (memberId );
80- if (member .isPresent ()) {
81- return member .get ();
93+ // SecurityContext에서 loginType 자동 추출
94+ String loginType = getCurrentLoginType ();
95+
96+ // loginType이 있으면 해당 테이블에서만 조회 (성능 최적화)
97+ if (loginType != null ) {
98+ return getMemberOrThrow (memberId , loginType );
8299 }
83100
84- // Member 테이블에 없으면 OAuth2Member 테이블에서 조회
85- if (oauth2MemberRepository != null ) {
86- java .util .Optional <com .ai .lawyer .domain .member .entity .OAuth2Member > oauth2Member =
87- oauth2MemberRepository .findById (memberId );
88- if (oauth2Member .isPresent ()) {
89- // OAuth2Member를 Member로 변환 (엔티티 호환성을 위해)
90- com .ai .lawyer .domain .member .entity .OAuth2Member oauth = oauth2Member .get ();
91- return Member .builder ()
92- .memberId (oauth .getMemberId ())
93- .loginId (oauth .getLoginId ())
94- .name (oauth .getName ())
95- .age (oauth .getAge ())
96- .gender (oauth .getGender ())
97- .role (oauth .getRole ())
98- .password ("" ) // OAuth2는 비밀번호 없음
99- .build ();
100- }
101+ // loginType이 없으면 하위 호환성을 위해 두 테이블 모두 조회
102+ // 먼저 Member 테이블에서 조회 (EntityManager 직접 사용)
103+ Member member = entityManager .find (Member .class , memberId );
104+ if (member != null ) {
105+ return member ;
106+ }
107+
108+ // Member 테이블에 없으면 OAuth2Member 테이블에서 조회 (EntityManager 직접 사용)
109+ com .ai .lawyer .domain .member .entity .OAuth2Member oauth2Member =
110+ entityManager .find (com .ai .lawyer .domain .member .entity .OAuth2Member .class , memberId );
111+ if (oauth2Member != null ) {
112+ // OAuth2Member를 Member로 변환 (엔티티 호환성을 위해)
113+ return Member .builder ()
114+ .memberId (oauth2Member .getMemberId ())
115+ .loginId (oauth2Member .getLoginId ())
116+ .name (oauth2Member .getName ())
117+ .age (oauth2Member .getAge ())
118+ .gender (oauth2Member .getGender ())
119+ .role (oauth2Member .getRole ())
120+ .password ("" ) // OAuth2는 비밀번호 없음
121+ .build ();
101122 }
102123
103124 // 둘 다 없으면 예외 발생
@@ -107,36 +128,35 @@ public static Member getMemberOrThrow(Long memberId) {
107128 /**
108129 * memberId와 loginType으로 회원을 조회합니다.
109130 * loginType이 "LOCAL"이면 Member 테이블에서, "OAUTH2"이면 OAuth2Member 테이블에서 조회합니다.
131+ * EntityManager를 직접 사용하여 무한 루프를 방지합니다.
110132 * @param memberId 회원 ID
111133 * @param loginType 로그인 타입 ("LOCAL" 또는 "OAUTH2")
112134 * @return Member 객체
113135 * @throws ResponseStatusException 회원을 찾을 수 없는 경우
114136 */
115137 public static Member getMemberOrThrow (Long memberId , String loginType ) {
116138 if ("OAUTH2" .equals (loginType )) {
117- // OAuth2 회원 조회
118- if (oauth2MemberRepository != null ) {
119- java .util .Optional <com .ai .lawyer .domain .member .entity .OAuth2Member > oauth2Member =
120- oauth2MemberRepository .findById (memberId );
121- if (oauth2Member .isPresent ()) {
122- // OAuth2Member를 Member로 변환
123- com .ai .lawyer .domain .member .entity .OAuth2Member oauth = oauth2Member .get ();
124- return Member .builder ()
125- .memberId (oauth .getMemberId ())
126- .loginId (oauth .getLoginId ())
127- .name (oauth .getName ())
128- .age (oauth .getAge ())
129- .gender (oauth .getGender ())
130- .role (oauth .getRole ())
131- .password ("" ) // OAuth2는 비밀번호 없음
132- .build ();
133- }
139+ // OAuth2 회원 조회 (EntityManager 직접 사용)
140+ com .ai .lawyer .domain .member .entity .OAuth2Member oauth2Member =
141+ entityManager .find (com .ai .lawyer .domain .member .entity .OAuth2Member .class , memberId );
142+
143+ if (oauth2Member != null ) {
144+ // OAuth2Member를 Member로 변환
145+ return Member .builder ()
146+ .memberId (oauth2Member .getMemberId ())
147+ .loginId (oauth2Member .getLoginId ())
148+ .name (oauth2Member .getName ())
149+ .age (oauth2Member .getAge ())
150+ .gender (oauth2Member .getGender ())
151+ .role (oauth2Member .getRole ())
152+ .password ("" ) // OAuth2는 비밀번호 없음
153+ .build ();
134154 }
135155 } else {
136- // LOCAL 회원 조회 (기본값 )
137- java . util . Optional < Member > member = memberRepository . findById ( memberId );
138- if (member . isPresent () ) {
139- return member . get () ;
156+ // LOCAL 회원 조회 (EntityManager 직접 사용 )
157+ Member member = entityManager . find ( Member . class , memberId );
158+ if (member != null ) {
159+ return member ;
140160 }
141161 }
142162
0 commit comments