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