본문 바로가기
TIL

TIL내일배움캠프 10주차 박싱, 언박싱 등

by 율량동박씨 2024. 6. 26.

오늘의 키워드

  • 박싱(Boxing)
  • 언박싱(Unboxing)
  • 스프링(Spring) 프레임워크
  • 성능 최적화
  • 데이터 바인딩
  • ORM (Object-Relational Mapping)
  • 캐시 사용

오늘의 내용

오늘은 스프링(Spring) 프레임워크에서 박싱(Boxing)과 언박싱(Unboxing)의 개념, 발생 상황, 그리고 성능 최적화 방법에 대해 학습했다

박싱과 언박싱 개념

  • 박싱(Boxing): 기본 타입(Primitive Type)을 해당하는 래퍼 클래스(Wrapper Class) 객체로 변환하는 과정 예를 들어, int를 Integer로 변환
  • 언박싱(Unboxing): 래퍼 클래스 객체를 다시 기본 타입으로 변환하는 과정. 예를 들어, Integer를 int로 변환

스프링에서 박싱과 언박싱이 발생하는 상황

  • 데이터 바인딩:
    • 스프링 MVC에서 요청 파라미터를 처리할 때 기본 타입과 래퍼 클래스 간의 변환이 발생
    • 예: 컨트롤러 메서드의 파라미터로 기본 타입을 사용할 때
     
@RestController
public class ExampleController {
@GetMapping("/example")
public String example(@RequestParam int number) { return "Number: " + number; }
}

 

  • ORM (Object-Relational Mapping):
    • 스프링 데이터 JPA를 사용하여 데이터베이스와 연동할 때, 숫자 타입 데이터를 엔티티의 래퍼 클래스 필드로 매핑할 경우 박싱이 발생
     
@Entity
public class ExampleEntity {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;

private Integer value; // 데이터베이스에서 조회 시 박싱 발생
}

 

성능 최적화 방안

  1. 기본 타입 사용:
    • 빈번하게 사용되는 변수나 컬렉션의 요소 타입으로 기본 타입을 사용하여 박싱과 언박싱을 피함
     
@RestController
public class ExampleController {
@GetMapping("/example")
public String example(@RequestParam int number) {
return "Number: " + number; }
}

 

  1. 데이터 바인딩 최적화:
    • 컨트롤러 메서드에서 데이터를 받을 때, 불필요한 박싱과 언박싱이 발생하지 않도록 주의.
    • 가능하면 기본 타입을 사용.
  2. 캐시 사용:
    • 자주 사용하는 데이터를 캐시 하여 불필요한 데이터베이스 조회와 그로 인한 박싱과 언박싱을 줄임.
    • 스프링 캐시 추상화(Spring Cache Abstraction)를 활용.
  3. 프로파일링 도구 사용:
    • 성능 문제가 의심될 때, 프로파일링 도구를 사용하여 박싱과 언박싱이 빈번하게 발생하는 지점을 찾아 최적화.
    • VisualVM, YourKit, JProfiler 등의 도구 활용.

예시 코드 (데이터 바인딩 최적화)

@RestController
public class ExampleController {
@GetMapping("/example")
public String example(@RequestParam int number) {
return "Number: " + number; }
}

예시 코드 (ORM 최적화)

@Entity
public class ExampleEntity {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id; // 기본 타입을 사용하여 박싱과 언박싱 최소화

private int value;
}
 

오늘의 회고

오늘은 스프링 애플리케이션에서 박싱과 언박싱이 발생하는 상황과 그로 인한 성능 저하 문제를 깊이 이해할 수 있었다. 특히 데이터 바인딩 과정에서 불필요한 박싱과 언박싱을 줄이는 것이 중요하다는 점을 깨달았다. 또한, 데이터베이스와의 연동에서 박싱이 발생할 수 있다는 점을 고려하여, 엔티티 설계 시 기본 타입과 래퍼 클래스를 적절히 사용해야 한다는 점도 알게 되었다.

스프링 애플리케이션의 성능을 최적화하기 위해서는 작은 부분에서의 최적화가 중요하며, 이를 위해 기본 타입을 적극적으로 사용하는 것과 캐시를 활용하는 것이 유용하다는 점을 다시 한번 인식하게 되었다. 앞으로 코드를 작성할 때 이러한 점들을 염두에 두고 효율적인 코드를 작성해야겠다.