woowacourse-teams / 2024-code-zap

코드 템플릿, Zap싸게 저장하고! Zap싸게 공유하자! 코드잽 ⚡
https://www.code-zap.com
15 stars 9 forks source link

[REFACTOR] Template.member와 Category.member의 FetchType을 EAGER로 변경 #664

Open zeus6768 opened 1 week ago

zeus6768 commented 1 week ago

📌 어떤 기능을 리팩터링 하나요?

영속성 컨텍스트의 Member 객체와 프록시 객체의 ID가 같더라도 equals 메서드를 실행할 때 false를 반환합니다.

Member.equals() 메서드의 아래 부분 때문입니다.

        if (o == null || getClass() != o.getClass()) {
            return false;
        }

카테고리와 템플릿의 사용자 검증 로직의 런타임 예외 가능성이 있습니다.

AS-IS

Category.java, Template.java

    @ManyToOne(fetch = FetchType.LAZY, optional = false)
    private Member member;
    public void validateAuthorization(Member member) {
        if (!member.equals(this.member)) {
            throw new CodeZapException(HttpStatus.UNAUTHORIZED, "해당 카테고리에 대한 권한이 없습니다.");
        }
    }

TO-BE

Category.java, Template.java

    @ManyToOne(optional = false)
    private Member member;
    public void validateAuthorization(Member member) {
        if (!getMember().equals(member)) {
            throw new CodeZapException(HttpStatus.UNAUTHORIZED, "해당 카테고리에 대한 권한이 없습니다.");
        }
    }

⏳ 예상 소요 시간

10분

🔍 참고할만한 자료(선택)

HoeSeong123 commented 1 week ago

지연 로딩이 여기저기서 문제를 일으키네요 😂

zeus6768 commented 1 week ago

@Transactional

@Transactional로 지연 로딩 문제를 해결할 수 있지만, 다음과 같은 이유로 FetchType을 바꾸는 게 더 낫다는 의견 기록해놓아요~!

  1. 조회 로직은 데이터베이스 트랜잭션에서 읽기 작업만 수행하므로, 해당 작업이 롤백될 일 이 없습니다. 따라서, @Transactional 어노테이션을 붙이는 것은 필요하지 않습니다.
  2. 조회 로직에 @Transactional 어노테이션을 붙이면 이로 인해 데이터베이스 커넥션을 획득하고, 트랜잭션을 시작하고, 커밋 또는 롤백하는 등의 부가적인 작업이 수행됩니다. 이는 성능에 부정적인 영향을 미칠 수 있습니다.