김호쭈
DevForYou
김호쭈
전체 방문자
오늘
어제
  • 분류 전체보기 (321)
    • • 데이터베이스(DB) (9)
      • __SQL__ (9)
    • •알고리즘(Algorithm ) (117)
      • 문제풀이 (99)
      • 스터디 (14)
      • 알고리즘 팁 (4)
    • •Compter Science (57)
      • Operating System (25)
      • Computer Network (1)
      • Computer Vision (16)
      • Artificial Intelligence (14)
      • Software Technology (1)
    • • 독서 (36)
      • Design Pattern (24)
      • 객체지향의 사실과 오해 (1)
      • Object Oriented Software En.. (11)
    • • 개발 (26)
      • React (3)
      • node.js (6)
      • Django (11)
      • Spring boot (6)
    • • 개발Tip (4)
      • GitHub (0)
    • •프로젝트 (2)
      • 물물 (2)
    • •App (54)
      • 안드로이드 with Kotlin (50)
      • 코틀린(Kotiln) (4)
    • •회고 (8)
    • •취준일기 (3)
    • • 기타 (2)

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

인기 글

태그

  • local저장소
  • GitHubDesktop
  • ㄱ
  • Remote저장소
  • 원격저장소
  • 로컬저장소
  • KMU_WINK
  • 깃허브데스크탑

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
김호쭈

DevForYou

• 개발/Spring boot

[SpringBoot&트러블슈팅] 연관관계 편의 메소드에서 @Builder를 사용할때 발생하는 NPE

2023. 7. 6. 12:34

# 에러 키워드

  • NPE ( NullPointException)
  • Bulider
  • 연관관계 편의 메소드

# 발단

연관관게 편의 메소드를 사용해서, 연관관계를 지정해주고 있었다. 여기서는 1:N의 양방향 관계를 관리하기 위함이었다.

즉, TAILOR_SHOP과 USER 두 엔티티가 존재하며, 각 SHOP이 N , USER가 1이다. 

// 유저 등록 등록 및 영속화 //
        User user = User.builder()
                .userId(dto.getUserId())
                .name(dto.getName())
                .password(dto.getPassword())
                .phoneNumber(dto.getPhoneNumber())
                .role(dto.getRole())
                .build();
        user.curPasswordEncode(passwordEncoder);
        userRepository.save(user);

        // TAILOR SHOP 등록 및 영속화 //
        BankDto bankDto = dto.getBankDto();
        TailorShop tailorShop = TailorShop.builder()
                .shopName(dto.getShopName())
                .address(dto.getAddress())
                .shopPhoneNumber(dto.getShopPhoneNumber())
                .bank(Bank.builder()
                        .bankName(bankDto.getBankName())
                        .accountNumber(bankDto.getAccountNumber())
                        .accountHolder(bankDto.getAccountHolder())
                        .build())
                .build();
        tailorShopRepository.save(tailorShop);
        
        // 연관관계 편의 메소드 // 
        user.addTailorShop(tailorShop);

위와 같이 평범환 관계 매칭을 해줬다. addTailorShop 코드는 아래와 같다.

// User
    public void addTailorShop(TailorShop shop) {
        this.tailorShops.add(shop);
        shop.registerUser(this);
    }

TailorShop은 아래와 같다.

// TailorShop
    public void registerUser(User user){
        this.user= user;
    }

즉, User에서도 TailorShop에 대한 참조를 가지기 있게 하기 위해 ArrayList에다가 shop을 추가해주도록 하는 메소드이다. 그러나 아무리 시도를해도 addTailorShop에서 NPE가 발생했다. 

 

# 해결

DTO와 영속화된 TailorShop과 User모두 이상이 없었다. 그래서 문제가 어디있는지 한시간동안 헤맸는데, 이유는 빌더패턴을 정확히는 롬복의 @Builder어노테이션을 사용함으로써 생기는 문제였다. 

User user = User.builder()
                .userId(dto.getUserId())
                .name(dto.getName())
                .password(dto.getPassword())
                .phoneNumber(dto.getPhoneNumber())
                .role(dto.getRole())
                .build();

user엔티티를 생성할때, 아래 필드의 ArrayList가 따로 지정되지 않기에 만들어 지지 않는다. 즉 해당 필드가 null인데 여기에 add를 하려다 보니까 에러가 난 것이다.

@OneToMany(mappedBy = "user")
private List<TailorShop> tailorShops = new ArrayList<>();

아래와 같이 

    @OneToMany(mappedBy = "user")
    @Builder.Default
    private List<TailorShop> tailorShops = new ArrayList<>();

빌더를 통해 생성시 해달 필드자체를 지정하지 않더라도 Default로 하여금 만들어지게 설정해주자. 그러면 빈 ArrayList가 생기고 이를 참조할 수 있게 된다.

저작자표시 (새창열림)

'• 개발 > Spring boot' 카테고리의 다른 글

[SpringBoot] Amazon Linux 2 AMI JDK11 설치 및 타임존 설정하기  (0) 2023.08.08
[SpringBoot&트러블슈팅] ddl-auto를 validate로 변경했을때 missing table 에러 해결하기  (0) 2023.08.01
[트러블슈팅] 타임리프에서 소수점 반올림 하는 방법  (0) 2023.05.20
[트러블슈팅] Github Action으로 스프링부트 CI/CD 적용중 생기는 경로 이슈  (0) 2023.05.05
[Spring boot] 스프링부트 배포시 타임리프(Thymeleaf) 경로 에러  (0) 2023.02.17
    '• 개발/Spring boot' 카테고리의 다른 글
    • [SpringBoot] Amazon Linux 2 AMI JDK11 설치 및 타임존 설정하기
    • [SpringBoot&트러블슈팅] ddl-auto를 validate로 변경했을때 missing table 에러 해결하기
    • [트러블슈팅] 타임리프에서 소수점 반올림 하는 방법
    • [트러블슈팅] Github Action으로 스프링부트 CI/CD 적용중 생기는 경로 이슈
    김호쭈
    김호쭈
    공부하고 정리하고 기록하기

    티스토리툴바