Integer와 int는 Java에서 숫자를 다룰 때 자주 쓰이지만, 서로 다른 타입이다.
차이를 요약하면 기본형 vs 참조형, 그리고 null 가능성과 기능 제공 여부이다.
| 구분 | int | Integer |
|---|---|---|
| 타입 | 기본형 (primitive) | 참조형 (wrapper class) |
| 메모리 | 스택에 값 자체 저장 | 힙에 객체로 저장 (레퍼런스 타입) |
| null 허용 | ❌ (null 불가능) | ✅ (null 가능) |
| 기능 | ❌ | ✅ (메서드 사용 가능, 예: toString(), compareTo()) |
| 성능 | ✅ 빠름 (오버헤드 없음) | ❌ 상대적으로 느림 (객체화 비용) |
Java는 int ↔ Integer 자동 변환을 지원한다:
int a = 10;
Integer b = a; // 오토박싱: int → Integer
int c = b; // 언박싱: Integer → int
하지만 null을 언박싱하면 NullPointerException 발생:
Integer x = null;
int y = x; // ❌ NullPointerException
int → 빠르고 단순한 연산이 필요할 때 (계산, 루프 등)
Integer → 객체가 필요한 상황 (예: 제네릭, 컬렉션, null 저장)
예: List<int>는 불가능하지만 List<Integer>는 가능
@Modifying 어노테이션은 Spring Data JPA에서 @Query와 함께 사용되는 데이터 변경용 쿼리에 붙이는 어노테이션입니다.
즉, SELECT가 아니라 INSERT, UPDATE, DELETE 같은 데이터를 수정하는 쿼리에 필요합니다.
Spring Data JPA에서 @Query는 기본적으로 조회(SELECT) 쿼리로 처리된다.
하지만 @Modifying을 붙이면 이 쿼리는 데이터 변경용이야라고 명시하게 되어 실행이 가능하다.
@Modifying
@Query("UPDATE User u SET u.userName = :userName WHERE u.id = :userId")
int updateUserName(@Param("userId") Long userId, @Param("userName") String userName);
int는 영향을 받은 row 수이다.
@Modifying은 실제 DB를 변경하므로, 반드시 @Transactional 안에서 호출되어야 한다.
서비스 메서드에 @Transactional을 붙이거나, 레포지토리 메서드 위에 붙여도 된다.
| 항목 | 설명 |
|---|---|
| 용도 | @Query를 이용한 INSERT/UPDATE/DELETE 쿼리 |
| 필수 조건 | @Transactional과 함께 사용 |
| 반환 타입 | void 또는 int (수정된 row 수) |