Trouble Shooting/JPA

[JPA] @OneToMany ์—ฐ๊ด€๊ด€๊ณ„ ๋งคํ•‘ ์‹œ Collection์„ ์ดˆ๊ธฐํ™” ํ–ˆ์ง€๋งŒ NullPointerException์ด ๋ฐœ์ƒํ•˜๋Š” ์ด์Šˆ

Zayson 2022. 4. 24. 17:36

๐Ÿค” ์ƒํ™ฉ

@OneToMany ์• ๋…ธํ…Œ์ด์…˜์„ ํ†ตํ•ด ์—ฐ๊ด€ ๊ด€๊ณ„ ๋งคํ•‘ ์‹œ NPE๋ฅผ ํ”ผํ•˜๊ธฐ ์œ„ํ•ด ๊ด€๋ก€์— ๋”ฐ๋ผ Collection์„ ์ดˆ๊ธฐํ™” ํ•ด์ฃผ์—ˆ์ง€๋งŒ ์ง€์†์ ์œผ๋กœ ๋งคํ•‘ ํ•„๋“œ์—์„œ NullPointerException์ด ๋ฐœ์ƒํ•˜๋Š” ์ด์Šˆ๊ฐ€ ์žˆ์—ˆ๋‹ค.

๐Ÿง‘‍๐Ÿ’ป ๋ฌธ์ œ ํŒŒ์•…

์ดˆ๊ธฐํ™”๋ฅผ ํ•ด์คŒ์—๋„ ํ•„๋“œ์˜ ์ดˆ๊ธฐํ™”๊ฐ€ ๋˜์ง€ ์•Š๋Š” ๊ฒƒ์€ @Builder ์• ๋…ธํ…Œ์ด์…˜์„ ํ†ตํ•ด ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•˜๊ณ  ์žˆ์—ˆ๊ธฐ ๋•Œ๋ฌธ์— ์•ˆ๋˜๋Š”๊ฑด ์•„๋‹๊นŒ ๊ณ ๋ฏผํ•ด๋ณด์•˜๋‹ค.

@Builder ์• ๋…ธํ…Œ์ด์…˜์ด ๋ถ™์€ ํด๋ž˜์Šค๋Š” ์ƒ์„ฑ ์‹œ ๋™์ผํ•œ ํ•„๋“œ๋ฅผ ๊ฐ€์ง„ ๋‚ด๋ถ€ Builder ํด๋ž˜์Šค๋ฅผ ํ†ตํ•ด ์„ค์ •๋œ ์†์„ฑ์„ ๋ณ€๊ฒฝํ•˜๋Š” ๋ฉ”์†Œ๋“œ๋ฅผ ๊ตฌํ˜„ํ•œ๋‹ค.

์ด ๋•Œ, ๋‚ด๋ถ€ ํด๋ž˜์Šค์˜ ํ•„๋“œ๋Š” ํ•œ ๋ฒˆ ๊ฐ’์ด ์ง€์ •๋œ ์ดํ›„์—๋„ ๋ฉ”์†Œ๋“œ๋ฅผ ํ†ตํ•ด ๊ฐ’์ด ๋ณ€๊ฒฝ๋  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— Non-Final ํ˜•ํƒœ๋กœ ํ•„๋“œ๊ฐ€ ์ง€์ •๋œ๋‹ค.

๋”ฐ๋ผ์„œ, ๋‚ด๋ถ€ Builder ํด๋ž˜์Šค์˜ Non-final ํ˜•ํƒœ๋กœ ์ง€์ •๋œ ํ•„๋“œ๋Š” ์ „์—ญ๋ณ€์ˆ˜๋กœ ์กด์žฌํ•˜๊ฒŒ ๋˜๊ณ  ์ดˆ๊ธฐ ์ƒ์„ฑ ์‹œ์— ์–ด๋–ค ๊ฐ’์œผ๋กœ๋„ ์ดˆ๊ธฐํ™” ๋˜์ง€ ์•Š์•˜๊ธฐ ๋•Œ๋ฌธ์— null๊ฐ’์ด ๋“ค์–ด๊ฐ€ ์žˆ๋Š” ์ƒํƒœ์ด๋‹ค.

์ด๋Ÿฐ ์ด์œ ๋กœ, ํด๋ž˜์Šค ๋ ˆ๋ฒจ Builder ์‚ฌ์šฉ ์‹œ ํ•„๋“œ๋ฅผ ์ดˆ๊ธฐํ™” ํ•ด๋„ NPE๊ฐ€ ๋ฐœ์ƒํ•œ ๊ฒƒ์œผ๋กœ ๋ณด์ธ๋‹ค.

class Example<T> {
   	private T foo;
   	private final String bar;      // final
   	
   	private Example(T foo, String bar) {
   		this.foo = foo;
   		this.bar = bar;
   	}
   	
   	public static <T> ExampleBuilder<T> builder() {
   		return new ExampleBuilder<T>();
   	}
   	
   	public static class ExampleBuilder<T> {
   		private T foo;
   		private String bar;        // non-final
   		
   		private ExampleBuilder() {}
   		
   		public ExampleBuilder foo(T foo) {
   			this.foo = foo;
   			return this;
   		}
   		
   		public ExampleBuilder bar(String bar) {
   			this.bar = bar;
   			return this;
   		}
   		
   		@java.lang.Override public String toString() {
   			return "ExampleBuilder(foo = " + foo + ", bar = " + bar + ")";
   		}
   		
   		public Example build() {
   			return new Example(foo, bar);
   		}
   	}
}

๐Ÿ’ก ํ•ด๊ฒฐ

@Builder๋ฅผ ํ†ตํ•ด ๊ฐ์ฒด ์ƒ์„ฑ ์‹œ ํ•„๋“œ ๊ฐ’์„ ์ดˆ๊ธฐํ™” ํ•˜๊ณ ์‹ถ์€ ๊ฒฝ์šฐ ์ดˆ๊ธฐํ™” ํ•˜๊ณ ์ž ํ•˜๋Š” ํ•„๋“œ์— @Builder.Default๋ฅผ ์‚ฌ์šฉํ•ด์ค€๋‹ค.

๋ฐ˜์‘ํ˜•