๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
โญ Personal_Study/Spring

JPA์—์„œ Wrapper class vs primitive type

by ํฌ์ŠคํŠธ์‰์ดํฌ 2023. 4. 17.

JPA์—์„œ ์—”ํ‹ฐํ‹ฐ๋ฅผ ์ƒ์„ฑํ•  ๋•Œ Wrapper class๋ฅผ ์‚ฌ์šฉํ•ด์•ผํ• ๊นŒ primitive type์„ ์‚ฌ์šฉํ•ด์•ผํ• ๊นŒ?

@Entity
public class Product {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    private String name;    

    private int stock; // Integer? int?
}

 ๋‹ค์Œ ์ƒํ™ฉ์—์„œ stock์€ int๋กœ ์ƒ์„ฑํ•ด์•ผ๋ ๊นŒ Integer๋กœ ์ƒ์„ฑํ•ด์•ผ๋ ๊นŒ?

1. primitive type & Wrapper Class

์›์‹œ ํƒ€์ž…(primitive type)

โœ” Java์—์„œ ๊ธฐ๋ณธ์œผ๋กœ ์ œ๊ณต๋˜๋Š” ๋ฐ์ดํ„ฐ ํƒ€์ž…

โœ” int, byte, short, long, float, double, boolean, char

โœ” ์žฅ์ 

  • ๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์šฉ๋Ÿ‰์ด ์ ๋‹ค. (์Šคํƒ ์˜์—ญ์— ๋ฐ”๋กœ ์ƒ์„ฑ)
  • ์„ฑ๋Šฅ์ด ์ข‹๋‹ค.

โœ” ๋‹จ์ 

  • โญnull ๊ฐ’์„ ํ—ˆ์šฉํ•˜์ง€ ์•Š๋Š”๋‹ค. (NPE ๋ฐœ์ƒ)

๋ž˜ํผ ํด๋ž˜์Šค(wrapper ํด๋ž˜์Šค)

โœ” ์›์‹œ ํƒ€์ž…์„ ๊ฐ์ฒด๋กœ ๊ฐ์‹ธ์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•ด์ฃผ๋Š” ํด๋ž˜์Šค

โœ” Integer, Long, Float, Double, Boolean ๋“ฑ

โœ” ์žฅ์ 

  • โญnull ๊ฐ’์„ ํ—ˆ์šฉํ•œ๋‹ค
  • ๋‹ค์–‘ํ•œ ๋ฉ”์„œ๋“œ๋ฅผ ์ œ๊ณตํ•œ๋‹ค

โœ” ๋‹จ์ 

  • ๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์šฉ๋Ÿ‰์ด ํฌ๋‹ค
  • ์„ฑ๋Šฅ์ด ๋‹ค์†Œ ๋–จ์–ด์ง„๋‹ค(๋ฐ•์‹ฑ, ์–ธ๋ฐ•์‹ฑ)

2. JPA์—์„œ๋Š” ๋ญ˜ ์‚ฌ์šฉํ•ด์•ผ๋ ๊นŒ?

โœ” JPA์—์„œ๋Š” ์ผ๋ฐ˜์ ์œผ๋กœ Wrapper ํด๋ž˜์Šค๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ๊ถŒ์žฅ๋˜๊ณ  Hibernates์˜ ๊ณต์‹ ๋ฌธ์„œ์—์„œ๋Š” ํŠนํžˆ ID์˜ ๊ฒฝ์šฐ์— Nullableํ•œ ์ž๋ฃŒํ˜•(Wrapper)๋ฅผ ์‚ฌ์šฉํ•  ๊ฒƒ์„ ๊ถŒ์žฅํ•˜๊ณ  ์žˆ๋‹ค

โœ” ๊ฐ€์žฅ ํฐ ์ด์œ ๋Š” db์—์„œ Null๊ฐ’ ํ—ˆ์šฉ์„ ํ†ตํ•ด์„œ ์–ป๋Š” ์ด์ ์ด ํฌ๋‹ค๋Š” ๊ฒƒ์ด๋‹ค.

โœ” ๋˜ํ•œ ๋ฐ•์‹ฑ/์–ธ๋ฐ•์‹ฑ์ด๋‚˜, ๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์šฉ๋Ÿ‰ ๋“ฑ ์„ฑ๋Šฅ์ƒ์˜ ๋‹จ์  ์—ญ์‹œ ์ปดํ“จํŒ… ์„ฑ๋Šฅ์˜ ํ–ฅ์ƒ์œผ๋กœ ์ธํ•ด ํฐ ์˜ํ–ฅ์„ ๋ฏธ์น˜์ง€ ์•Š์„ ์ •๋„๊ฐ€ ๋˜์—ˆ๋‹ค.

 

  1. NULL ๊ฐ’ ํ—ˆ์šฉ: Wrapper Class๋Š” NULL ๊ฐ’์„ ํ—ˆ์šฉํ•˜๋ฏ€๋กœ, ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์˜ ํ•ด๋‹น ์ปฌ๋Ÿผ์ด NULL ๊ฐ’์„ ๊ฐ€์งˆ ์ˆ˜ ์žˆ๋Š” ๊ฒฝ์šฐ Wrapper Class๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์ ์ ˆํ•˜๋‹ค
  2. Optional์„ ํ†ตํ•œ ์•ˆ์ „ํ•œ NULL ์ฒ˜๋ฆฌ: JPA๋Š” Optional์„ ํ†ตํ•œ Null ๊ฐ’ ์ฒ˜๋ฆฌ๋ฅผ ์ ๊ทน์ ์œผ๋กœ ์ง€์›ํ•˜๋ฏ€๋กœ primitive type์—์„œ NPE๊ฐ€ ์•„๋‹Œ ์„œ๋น„์Šค์— ๋งž๊ฒŒ null ๊ฐ’์„ ์ ์ ˆํ•˜๊ฒŒ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๋‹ค.
public interface ProductRepository extends JpaRepository<Product, Long> {
    Optional<Product> findById(Long id);
}

@Service
public class ProductService {
    private final ProductRepository productRepository;

    public ProductService(ProductRepository productRepository) {
        this.productRepository = productRepository;
    }

    // optional์„ ํ™œ์šฉํ•ด ์ƒํ™ฉ์— ๋งž๊ฒŒ ์—๋Ÿฌ๋ฅผ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๋‹ค.
    public Product getProductById(Long id) {
        return productRepository.findById(id)
                .orElseThrow(() -> new ProductNotFoundException("Product not found with id: " + id));
    }
}

๊ฒฐ๋ก 

โœ” ์ผ๋ฐ˜์ ์ธ ์ƒํ™ฉ์—์„œ๋Š” Null ๊ฐ’ ํ—ˆ์šฉ์ด ๊ฐ€์ ธ์˜ค๋Š” ์ด์ ์ด ์ปค์„œ Wrapper ํด๋ž˜์Šค๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์œ ๋ฆฌํ•˜๋‹ค.

โœ” ๊ทธ๋Ÿฌ๋‚˜ ์„ฑ๋Šฅ์ด ํŠนํžˆ ์ค‘์š”ํ•˜๋ฉฐ, db์—์„œ ํ•ด๋‹น ์†์„ฑ์— ๋Œ€ํ•ด ํ•ญ์ƒ ๊ฐ’์ด ์กด์žฌํ•จ์ด ๋ณด์žฅ๋  ๊ฒฝ์šฐ primitive type์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์œ ๋ฆฌํ•  ์ˆ˜๋„ ์žˆ๋‹ค.

๋Œ“๊ธ€