본문 바로가기

성능고도화/적용

[코드 리팩토링] 불필요한 DB쿼리 실행 줄이기

1. 로그인  

같은 쿼리 2번 발생

: members 테이블에서 이메일로 회원정보를 검색 + 이메일로 회원정보를 검색 

2023-06-07 13:16:14.160 DEBUG 33594 --- [nio-8443-exec-6] tor$SharedEntityManagerInvocationHandler : Creating new EntityManager for shared EntityManager invocation
Hibernate: 
    select
        member0_.member_id as member_i1_2_,
        member0_.created_at as created_2_2_,
        member0_.last_modified_at as last_mod3_2_,
        member0_.created_count as created_4_2_,
        member0_.deletion_date as deletion5_2_,
        member0_.email as email6_2_,
        member0_.favorite_count as favorite7_2_,
        member0_.image_url as image_ur8_2_,
        member0_.is_admin as is_admin9_2_,
        member0_.is_voted as is_vote10_2_,
        member0_.nickname as nicknam11_2_,
        member0_.password as passwor12_2_,
        member0_.provider as provide13_2_,
        member0_.provider_id as provide14_2_,
        member0_.recorde_count as recorde15_2_,
        member0_.status as status16_2_ 
    from
        members member0_ 
    where
        member0_.email=?
Hibernate: 
    select
        roles0_.member_member_id as member_m1_0_0_,
        roles0_.roles as roles2_0_0_ 
    from
        member_roles roles0_ 
    where
        roles0_.member_member_id=?
2023-06-07 13:16:14.263 DEBUG 33594 --- [nio-8443-exec-6] tor$SharedEntityManagerInvocationHandler : Creating new EntityManager for shared EntityManager invocation
Hibernate: 
    select
        member0_.member_id as member_i1_2_,
        member0_.created_at as created_2_2_,
        member0_.last_modified_at as last_mod3_2_,
        member0_.created_count as created_4_2_,
        member0_.deletion_date as deletion5_2_,
        member0_.email as email6_2_,
        member0_.favorite_count as favorite7_2_,
        member0_.image_url as image_ur8_2_,
        member0_.is_admin as is_admin9_2_,
        member0_.is_voted as is_vote10_2_,
        member0_.nickname as nicknam11_2_,
        member0_.password as passwor12_2_,
        member0_.provider as provide13_2_,
        member0_.provider_id as provide14_2_,
        member0_.recorde_count as recorde15_2_,
        member0_.status as status16_2_ 
    from
        members member0_ 
    where
        member0_.email=?
Hibernate: 
    select
        roles0_.member_member_id as member_m1_0_0_,
        roles0_.roles as roles2_0_0_ 
    from
        member_roles roles0_ 
    where
        roles0_.member_member_id=?
2023-06-07 13:16:14.380  INFO 33594 --- [nio-8443-exec-6] c.a.h.MemberAuthenticationSuccessHandler : Login Successful 로그인 인증성공
2023-06-07 13:17:05.410  INFO 33594 --- [nio-8443-exec-7] Spring Security Debugger                 :

 

 

코드 살펴보기

findByEmail
Member 엔티티 클래스에서 EAGER로 설정된 roles

 

프로젝트 당시 구현파트를 나누는 과정에서 나는 전체 CRUD + 시큐리티 적용을 담당했고 다른 팀원분께서 다른기능+OAuth2.0 로직을 맡으셨다. 우리애플리케이션에서 Role 정보는 필요없었지만 Oauth 로직에 필요해서 껍데기만 있는 Role을 만드셨다고 했다. 그래서 로그를 보고 처음에는 권한을 검증하는 인가로직이 있는 줄 알고 그 인가로직에서 뭔가 Member에 관련된 것을 조회하나 싶었던 것 같다.  (완전 아니었다 ..ㅎㅎ)


 

 

시도 1

현재 OAuth 인증흐름을 잘 모르고 있기도 하고, 대부분의 애플리케이션에 Role 이 사용되지 않을까, 싶어서

findByEmail을 호출할때 엔티티그래프를 이용해 roles를 한번에 불러오도록 설정하기로 결정했다.

 

MemberRepository에 @EntityGraph 추가
loadUserByUsername 메소드에서 이메일 조회메서드 변경

 

 

 

 

에러발생

org.springframework.beans.factory.UnsatisfiedDependencyException

findByEmailWithRoles 메소드명에서 WithRoles를 Member의 필드로 해석하려고 해서 발생한 오류였다. 찾아보니 Spring Data JPA의 메소드 이름 규칙때문이었다. 메소드 이름으로 쿼리를 생성하는 방식에서는 메소드 이름의 일부를 엔티티의 프로퍼티로 해석하려고 하는데, WithRoles가 Member의 프로퍼티가 아니기때문에 에러가 발생한다. 

@Query 어노테이션과 JPQL 을 사용해 명시적으로 쿼리를 지정했으나

되려 롤 정보를 가지고 오는 select 쿼리가 한번 더 발생하는 결과만 얻었다.. 

 

 

 

 

시도 2

제대로 살필생각보다 일단 Role 부분에 꽂혀있었던거 같다.

그래서 권한에 대한 인증로직을 찾으려고 클래스들을 뒤지는데, 아무리 봐도 없었다.

뭔가 쎄해서 뒤늦은 디버깅을 시도했다. 

 

attemptAuthentication 메서드는 로그인 정보를 인증 후, Authentication 객체를 반환하는 로직인데, 이곳에 임포스터가 .. 대놓고 있었다. 탈퇴회원을 DB에서 삭제하지 않고 상태값만 "DELETE" 로 바꿔서 스케줄러로 30일간 보관한 뒤 삭제하도록 하는 로직을 짰다. 그과정에서 탈퇴회원의 로그인을 막기위해 memberRepository에서 회원정보를 조회해서 회원의 status가 DELETE 일 경우 예외를 발생시키는 로직을 사용했고, 그것이 두번의 member 정보 조회를 불러 온 것이었다. 

 

 

 

 해결 

attemptAuthentication 메서드에 있던 확인로직을 loadUserByUsername 메서드로 옮겨서 불필요한 DB 쿼리실행을 1번으로 줄였다.

 


 

 

2. 회원가입

같은 쿼리 2번 발생

: members 테이블에서 이메일로 회원정보를 검색 + 이메일로 회원정보를 검색 

2023-06-07 16:55:43.567 DEBUG 49121 --- [nio-8443-exec-7] o.j.s.OpenEntityManagerInViewInterceptor : Opening JPA EntityManager in OpenEntityManagerInViewInterceptor
Hibernate: 
    select
        member0_.member_id as member_i1_2_,
        member0_.created_at as created_2_2_,
        member0_.last_modified_at as last_mod3_2_,
        member0_.created_count as created_4_2_,
        member0_.deletion_date as deletion5_2_,
        member0_.email as email6_2_,
        member0_.favorite_count as favorite7_2_,
        member0_.image_url as image_ur8_2_,
        member0_.is_admin as is_admin9_2_,
        member0_.is_voted as is_vote10_2_,
        member0_.nickname as nicknam11_2_,
        member0_.password as passwor12_2_,
        member0_.provider as provide13_2_,
        member0_.provider_id as provide14_2_,
        member0_.recorde_count as recorde15_2_,
        member0_.status as status16_2_ 
    from
        members member0_ 
    where
        member0_.email=?
Hibernate: 
    select
        member0_.member_id as member_i1_2_,
        member0_.created_at as created_2_2_,
        member0_.last_modified_at as last_mod3_2_,
        member0_.created_count as created_4_2_,
        member0_.deletion_date as deletion5_2_,
        member0_.email as email6_2_,
        member0_.favorite_count as favorite7_2_,
        member0_.image_url as image_ur8_2_,
        member0_.is_admin as is_admin9_2_,
        member0_.is_voted as is_vote10_2_,
        member0_.nickname as nicknam11_2_,
        member0_.password as passwor12_2_,
        member0_.provider as provide13_2_,
        member0_.provider_id as provide14_2_,
        member0_.recorde_count as recorde15_2_,
        member0_.status as status16_2_ 
    from
        members member0_ 
    where
        member0_.email=?
2023-06-07 16:55:43.711 DEBUG 49121 --- [nio-8443-exec-7] o.s.orm.jpa.JpaTransactionManager        : Found thread-bound EntityManager [SessionImpl(537053766<open>)] for JPA transaction
2023-06-07 16:55:43.711 DEBUG 49121 --- [nio-8443-exec-7] o.s.orm.jpa.JpaTransactionManager        : Creating new transaction with name [org.springframework.data.jpa.repository.support.SimpleJpaRepository.save]: PROPAGATION_REQUIRED,ISOLATION_DEFAULT
2023-06-07 16:55:43.711 DEBUG 49121 --- [nio-8443-exec-7] o.s.orm.jpa.JpaTransactionManager        : Exposing JPA transaction as JDBC [org.springframework.orm.jpa.vendor.HibernateJpaDialect$HibernateConnectionHandle@1d3147b6]
Hibernate: 
    insert 
    into
        members
        (member_id, created_at, last_modified_at, created_count, deletion_date, email, favorite_count, image_url, is_admin, is_voted, nickname, password, provider, provider_id, recorde_count, status) 
    values
        (default, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
2023-06-07 16:55:43.713 DEBUG 49121 --- [nio-8443-exec-7] o.s.orm.jpa.JpaTransactionManager        : Initiating transaction commit
2023-06-07 16:55:43.713 DEBUG 49121 --- [nio-8443-exec-7] o.s.orm.jpa.JpaTransactionManager        : Committing JPA transaction on EntityManager [SessionImpl(537053766<open>)]
2023-06-07 16:55:43.713 DEBUG 49121 --- [nio-8443-exec-7] o.s.orm.jpa.JpaTransactionManager        : Not closing pre-bound JPA EntityManager after transaction
2023-06-07 16:55:43.721 DEBUG 49121 --- [nio-8443-exec-7] o.j.s.OpenEntityManagerInViewInterceptor : Closing JPA EntityManager in OpenEntityManagerInViewInterceptor
2023-06-07 16:56:04.731  INFO 49121 --- [MessageBroker-1] o.s.w.s.c.WebSocketMessageBrokerStats    : WebSocketSession[0 current WS(0)-HttpStream(0)-HttpPoll(0), 0 total, 0 closed abnormally (0 connect failure, 0 send limit, 0 transport error)], stompSubProtocol[processed CONNECT(0)-CONNECTED(0)-DISCONNECT(0)], stompBrokerRelay[null], inboundChannel[pool size = 0, active threads = 0, queued tasks = 0, completed tasks = 0], outboundChannel[pool size = 0, active threads = 0, queued tasks = 0, completed tasks = 0], sockJsScheduler[pool size = 1, active threads = 1, queued tasks = 0, completed tasks = 0]

 

 

 이 경우 이메일의 중복을 검사하는 로직이 컨트롤러와 서비스에 두번 들어간 경우였다.

중복된 이메일일 경우 ErrorResponse로 중복된 이메일이란 응답을 보내달란 프론트팀의 요청으로 

컨트롤러에 verifyExistsCheck를 통해 중복 검사 로직을 추가하고,

서비스단의 중복검사 로직을 삭제하지 않아 발생한 문제였다.

 

 

 

 

 

 해결 

서비스 로직에서의 중복된 중복검사로직을 삭제한뒤 테스트 했다.

select 쿼리가 한번만 가는 것을 볼 수 있다~~~

 


 

 

 

3. 회원 닉네임 수정

닉네임 수정로직에는 회원 닉네임이 DB에 존재하는지 확인을 위한 조회메서드 하나와, 회원이 존재하는 회원인지 체크하는 조회메서드로 같은 회원정보에 대해 2번의 select 쿼리가 실행됐다. 코드를 살펴보니 닉네임 중복시에도 member 전체 정보를 불러오는 메서드를 사용하고 있었다. 찾아보니 " exists(속성명) "  으로 DB에서 중복되는 닉네임이 있는지 boolean 값으로 체크할 수 있었다.

 

변경전
변경후

 

 

변경전 & 변경후 로직

닉네임 중복 확인이 아닌  리턴값으로 Member 를 반환하는, 회원 정보를 가져오는 메서드를 사용하고 있었다. 이 메서드는 닉네임 중복 체크 메서드와 닉네임 수정 메서드에서 모두 사용되고 있었다. 

 

      



  
  ✅--------- 변경전 → 컨트롤러 : 닉네임 중복로직 --------
    @PostMapping("/check")
    public ResponseEntity checkNickname(@Valid @RequestBody MemberDto.CheckNickname requestBody) {
        ResponseEntity checkNickname = memberService.verifyExistsNickname(requestBody.getNickname());

        if (checkNickname != null) return checkNickname;
        return new ResponseEntity(requestBody.getNickname(), HttpStatus.OK);
    }
    
    
   ✅--------- 변경후 → 컨트롤러 : 닉네임 중복로직 --------        
   @PostMapping("/check")
    public ResponseEntity checkNickname(@Valid @RequestBody MemberDto.CheckNickname requestBody) {
        boolean existsNickname = memberService.verifyExistsNickname(requestBody.getNickname());
        if (existsNickname) return memberService.errorResponseNickname();

        return new ResponseEntity(requestBody.getNickname(), HttpStatus.OK);
    }
    
    
    



   

    
   ✅--------- 변경전 → 컨트롤러 : 닉네임 수정로직 --------
    @PatchMapping("/{member-id}/nickname/edit")
    public ResponseEntity patchMemberNickname(@PathVariable("member-id") long memberId,
                                              @Valid @RequestBody MemberDto.PatchNickname requestBody,
                                              Authentication authentication) {

        Map<String, Object> principal = (Map) authentication.getPrincipal();
        long jwtMemberId = ((Number) principal.get("memberId")).longValue();
        boolean isAdmin = (boolean) principal.get("isAdmin");

        if (isAdmin == false) {
            if (jwtMemberId != requestBody.getMemberId() || memberId != requestBody.getMemberId() || jwtMemberId != memberId) {
                ErrorResponse errorResponse = ErrorResponse.of(HttpStatus.FORBIDDEN, "권한이 없는 사용자 입니다.");
                return ResponseEntity.status(HttpStatus.FORBIDDEN).body(errorResponse);
            }
        }
    
        Member member = mapper.patchNicknameDtoToMember(requestBody);
        ResponseEntity checkMember = memberService.verifyExistsNickname(member.getNickname());
        if (checkMember != null) return checkMember;

        Member responseMember = memberService.updateMemberNickname(member, memberId);
        return new ResponseEntity<>(mapper.memberToPatchResponseDto(responseMember), HttpStatus.OK);
    }
    
    
   ✅--------- 변경후 → 컨트롤러 : 닉네임 수정로직 --------
    @PatchMapping("/{member-id}/nickname/edit")
    public ResponseEntity patchMemberNickname(@PathVariable("member-id") long memberId,
                                              @Valid @RequestBody MemberDto.PatchNickname requestBody,
                                              Authentication authentication) {

		//반복되는 인증로직도 체크 클래스를 만들어서 그곳으로 로직을 모았다.
        memberAuthentication.patchNicknameAuthentication(authentication, requestBody, memberId);
        boolean existsNickname = memberService.verifyExistsNickname(requestBody.getNickname());
        if (existsNickname) return memberService.errorResponseNickname();

        Member member = mapper.patchNicknameDtoToMember(requestBody);
        Member responseMember = memberService.updateMemberNickname(member,memberId);
        return new ResponseEntity<>(mapper.memberToPatchResponseDto(responseMember), HttpStatus.OK);
    }





   
   

   ✅--------- 서비스 : 회원닉네임 수정로직 (변경없음) --------
    public Member updateMemberNickname(Member member, long memberId) {
        Member findMember = findVerifiedMember(memberId);
        Optional.ofNullable(member.getNickname())
                .ifPresent(nickname -> findMember.setNickname(nickname));
        return memberRepository.save(findMember);
    }


    
    
    
    
    

   
   ✅--------- 변경전 → 서비스 : 두개의 컨트롤러 메서드가 함께 사용하고 있던 닉네임중복체크로직 --------
   public ResponseEntity<ErrorResponse> verifyExistsNickname(String nickname) {
        Optional<Member> memberNickname = memberRepository.findByNickname(nickname);
        if (memberNickname.isPresent()) {
            ErrorResponse errorResponse = ErrorResponse.of(HttpStatus.BAD_REQUEST, "이미 사용중인 이름입니다.");
            return ResponseEntity.status(HttpStatus.BAD_REQUEST).body(errorResponse);
        }
        return null;
    }
    
   
   
    
   ✅--------- 변경후 → 서비스 : 닉네임중복체크 메서드를 변경하고 errorResponse 분리 --------
    public boolean verifyExistsNickname(String nickname) {
        return memberRepository.existsByNickname(nickname);
    }


    public ResponseEntity errorResponseNickname() {
            ErrorResponse errorResponse = ErrorResponse.of(HttpStatus.BAD_REQUEST, "이미 사용중인 이름입니다.");
            return ResponseEntity.status(HttpStatus.BAD_REQUEST).body(errorResponse);
    }

 

 

변경전후 쿼리로그 차이


✅--------- 변경전 ----------

Hibernate: 
    select // 회원조회 1번
        member0_.member_id as member_i1_2_0_,
        member0_.created_at as created_2_2_0_,
        member0_.last_modified_at as last_mod3_2_0_,
        member0_.created_count as created_4_2_0_,
        member0_.deletion_date as deletion5_2_0_,
        member0_.email as email6_2_0_,
        member0_.favorite_count as favorite7_2_0_,
        member0_.image_url as image_ur8_2_0_,
        member0_.is_admin as is_admin9_2_0_,
        member0_.is_voted as is_vote10_2_0_,
        member0_.nickname as nicknam11_2_0_,
        member0_.password as passwor12_2_0_,
        member0_.provider as provide13_2_0_,
        member0_.provider_id as provide14_2_0_,
        member0_.recorde_count as recorde15_2_0_,
        member0_.status as status16_2_0_,
        roles1_.member_member_id as member_m1_0_1_,
        roles1_.roles as roles2_0_1_ 
    from
        members member0_ 
    left outer join
        member_roles roles1_ 
            on member0_.member_id=roles1_.member_member_id 
    where
        member0_.member_id=?
2023-06-08 15:25:38.917 DEBUG 79861 --- [nio-8443-exec-9] o.s.orm.jpa.JpaTransactionManager        : Found thread-bound EntityManager [SessionImpl(1036520024<open>)] for JPA transaction
2023-06-08 15:25:38.918 DEBUG 79861 --- [nio-8443-exec-9] o.s.orm.jpa.JpaTransactionManager        : Creating new transaction with name [org.springframework.data.jpa.repository.support.SimpleJpaRepository.findById]: PROPAGATION_REQUIRED,ISOLATION_DEFAULT,readOnly
2023-06-08 15:25:38.918 DEBUG 79861 --- [nio-8443-exec-9] o.s.orm.jpa.JpaTransactionManager        : Exposing JPA transaction as JDBC [org.springframework.orm.jpa.vendor.HibernateJpaDialect$HibernateConnectionHandle@22adb955]
Hibernate: 
    select // 회원조회 2번 ㅜㅜ
        member0_.member_id as member_i1_2_0_,
        member0_.created_at as created_2_2_0_,
        member0_.last_modified_at as last_mod3_2_0_,
        member0_.created_count as created_4_2_0_,
        member0_.deletion_date as deletion5_2_0_,
        member0_.email as email6_2_0_,
        member0_.favorite_count as favorite7_2_0_,
        member0_.image_url as image_ur8_2_0_,
        member0_.is_admin as is_admin9_2_0_,
        member0_.is_voted as is_vote10_2_0_,
        member0_.nickname as nicknam11_2_0_,
        member0_.password as passwor12_2_0_,
        member0_.provider as provide13_2_0_,
        member0_.provider_id as provide14_2_0_,
        member0_.recorde_count as recorde15_2_0_,
        member0_.status as status16_2_0_,
        roles1_.member_member_id as member_m1_0_1_,
        roles1_.roles as roles2_0_1_ 
    from
        members member0_ 
    left outer join
        member_roles roles1_ 
            on member0_.member_id=roles1_.member_member_id 
    where
        member0_.member_id=?
2023-06-08 15:25:38.923 DEBUG 79861 --- [nio-8443-exec-9] o.s.orm.jpa.JpaTransactionManager        : Initiating transaction commit
2023-06-08 15:25:38.923 DEBUG 79861 --- [nio-8443-exec-9] o.s.orm.jpa.JpaTransactionManager        : Committing JPA transaction on EntityManager [SessionImpl(1036520024<open>)]
2023-06-08 15:25:38.923 DEBUG 79861 --- [nio-8443-exec-9] o.s.orm.jpa.JpaTransactionManager        : Not closing pre-bound JPA EntityManager after transaction
2023-06-08 15:25:38.924 DEBUG 79861 --- [nio-8443-exec-9] o.s.orm.jpa.JpaTransactionManager        : Found thread-bound EntityManager [SessionImpl(1036520024<open>)] for JPA transaction
2023-06-08 15:25:38.924 DEBUG 79861 --- [nio-8443-exec-9] o.s.orm.jpa.JpaTransactionManager        : Creating new transaction with name [org.springframework.data.jpa.repository.support.SimpleJpaRepository.save]: PROPAGATION_REQUIRED,ISOLATION_DEFAULT
2023-06-08 15:25:38.924 DEBUG 79861 --- [nio-8443-exec-9] o.s.orm.jpa.JpaTransactionManager        : Exposing JPA transaction as JDBC [org.springframework.orm.jpa.vendor.HibernateJpaDialect$HibernateConnectionHandle@72f07b0e]
2023-06-08 15:25:38.924 DEBUG 79861 --- [nio-8443-exec-9] o.s.orm.jpa.JpaTransactionManager        : Initiating transaction commit
2023-06-08 15:25:38.924 DEBUG 79861 --- [nio-8443-exec-9] o.s.orm.jpa.JpaTransactionManager        : Committing JPA transaction on EntityManager [SessionImpl(1036520024<open>)]
Hibernate: 
    update
        members 
    set
        created_at=?,
        last_modified_at=?,
        created_count=?,
        deletion_date=?,
        email=?,
        favorite_count=?,
        image_url=?,
        is_admin=?,
        is_voted=?,
        nickname=?,
        password=?,
        provider=?,
        provider_id=?,
        recorde_count=?,
        status=? 
    where
        member_id=?
2023-06-08 15:25:38.933 DEBUG 79861 --- [nio-8443-exec-9] o.s.orm.jpa.JpaTransactionManager        : Not closing pre-bound JPA EntityManager after transaction
Hibernate: 
    select
        membertagl0_.member_id as member_i2_3_0_,
        membertagl0_.member_tag_id as member_t1_3_0_,
        membertagl0_.member_tag_id as member_t1_3_1_,
        membertagl0_.member_id as member_i2_3_1_,
        membertagl0_.tag_id as tag_id3_3_1_,
        tag1_.tag_id as tag_id1_7_2_,
        tag1_.name as name2_7_2_ 
    from
        member_tag membertagl0_ 
    left outer join
        tag tag1_ 
            on membertagl0_.tag_id=tag1_.tag_id 
    where
        membertagl0_.member_id=?

 

✅--------- 변경후 ! ----------

Hibernate: 
    select
        member0_.member_id as col_0_0_ 
    from
        members member0_ 
    where
        member0_.nickname=? limit ?
2023-06-08 15:25:38.917 DEBUG 79861 --- [nio-8443-exec-9] o.s.orm.jpa.JpaTransactionManager        : Found thread-bound EntityManager [SessionImpl(1036520024<open>)] for JPA transaction
2023-06-08 15:25:38.918 DEBUG 79861 --- [nio-8443-exec-9] o.s.orm.jpa.JpaTransactionManager        : Creating new transaction with name [org.springframework.data.jpa.repository.support.SimpleJpaRepository.findById]: PROPAGATION_REQUIRED,ISOLATION_DEFAULT,readOnly
2023-06-08 15:25:38.918 DEBUG 79861 --- [nio-8443-exec-9] o.s.orm.jpa.JpaTransactionManager        : Exposing JPA transaction as JDBC [org.springframework.orm.jpa.vendor.HibernateJpaDialect$HibernateConnectionHandle@22adb955]
Hibernate: 
    select
        member0_.member_id as member_i1_2_0_,
        member0_.created_at as created_2_2_0_,
        member0_.last_modified_at as last_mod3_2_0_,
        member0_.created_count as created_4_2_0_,
        member0_.deletion_date as deletion5_2_0_,
        member0_.email as email6_2_0_,
        member0_.favorite_count as favorite7_2_0_,
        member0_.image_url as image_ur8_2_0_,
        member0_.is_admin as is_admin9_2_0_,
        member0_.is_voted as is_vote10_2_0_,
        member0_.nickname as nicknam11_2_0_,
        member0_.password as passwor12_2_0_,
        member0_.provider as provide13_2_0_,
        member0_.provider_id as provide14_2_0_,
        member0_.recorde_count as recorde15_2_0_,
        member0_.status as status16_2_0_,
        roles1_.member_member_id as member_m1_0_1_,
        roles1_.roles as roles2_0_1_ 
    from
        members member0_ 
    left outer join
        member_roles roles1_ 
            on member0_.member_id=roles1_.member_member_id 
    where
        member0_.member_id=?
2023-06-08 15:25:38.923 DEBUG 79861 --- [nio-8443-exec-9] o.s.orm.jpa.JpaTransactionManager        : Initiating transaction commit
2023-06-08 15:25:38.923 DEBUG 79861 --- [nio-8443-exec-9] o.s.orm.jpa.JpaTransactionManager        : Committing JPA transaction on EntityManager [SessionImpl(1036520024<open>)]
2023-06-08 15:25:38.923 DEBUG 79861 --- [nio-8443-exec-9] o.s.orm.jpa.JpaTransactionManager        : Not closing pre-bound JPA EntityManager after transaction
2023-06-08 15:25:38.924 DEBUG 79861 --- [nio-8443-exec-9] o.s.orm.jpa.JpaTransactionManager        : Found thread-bound EntityManager [SessionImpl(1036520024<open>)] for JPA transaction
2023-06-08 15:25:38.924 DEBUG 79861 --- [nio-8443-exec-9] o.s.orm.jpa.JpaTransactionManager        : Creating new transaction with name [org.springframework.data.jpa.repository.support.SimpleJpaRepository.save]: PROPAGATION_REQUIRED,ISOLATION_DEFAULT
2023-06-08 15:25:38.924 DEBUG 79861 --- [nio-8443-exec-9] o.s.orm.jpa.JpaTransactionManager        : Exposing JPA transaction as JDBC [org.springframework.orm.jpa.vendor.HibernateJpaDialect$HibernateConnectionHandle@72f07b0e]
2023-06-08 15:25:38.924 DEBUG 79861 --- [nio-8443-exec-9] o.s.orm.jpa.JpaTransactionManager        : Initiating transaction commit
2023-06-08 15:25:38.924 DEBUG 79861 --- [nio-8443-exec-9] o.s.orm.jpa.JpaTransactionManager        : Committing JPA transaction on EntityManager [SessionImpl(1036520024<open>)]
Hibernate: 
    update
        members 
    set
        created_at=?,
        last_modified_at=?,
        created_count=?,
        deletion_date=?,
        email=?,
        favorite_count=?,
        image_url=?,
        is_admin=?,
        is_voted=?,
        nickname=?,
        password=?,
        provider=?,
        provider_id=?,
        recorde_count=?,
        status=? 
    where
        member_id=?
2023-06-08 15:25:38.933 DEBUG 79861 --- [nio-8443-exec-9] o.s.orm.jpa.JpaTransactionManager        : Not closing pre-bound JPA EntityManager after transaction
Hibernate: 
    select
        membertagl0_.member_id as member_i2_3_0_,
        membertagl0_.member_tag_id as member_t1_3_0_,
        membertagl0_.member_tag_id as member_t1_3_1_,
        membertagl0_.member_id as member_i2_3_1_,
        membertagl0_.tag_id as tag_id3_3_1_,
        tag1_.tag_id as tag_id1_7_2_,
        tag1_.name as name2_7_2_ 
    from
        member_tag membertagl0_ 
    left outer join
        tag tag1_ 
            on membertagl0_.tag_id=tag1_.tag_id 
    where
        membertagl0_.member_id=?

 

 

 

 

닉네임 중복발생 시 로그

중복시에 더 이상 로직을 진행하지 않도록 컨트롤러 단의 초반부에  체크 로직을 집어넣었다. 깔끔하다.. 행복하다..