# 에러 키워드
- 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 |