Skip to main content

[Java] package.info


1. package-info란?

자바에서 패키지 단위의 문서화와 어노테이션을 관리하기 위해 만드는 특별한 파일이다. 일반 클래스처럼 실행되는 건 아니고, 패키지에 대한 설명을 제공하거나 , 패키지 전체에 공통적으로 적용되는 어노테이션을 관리할 때 쓰는 파일이다. 패키지를 생성할 때 Create package-info.java에 체크하면 패키지 인포 파일을 만들 수 있다. 파일명은 반드시 package-info.java이고, 안에는 오직 패키지 선언 1개만 들어가야 한다.

1.1 Javadoc 주석

  • 클래스나 메서드에 Javadoc을 달 수 있듯이, 패키지에도 해당 패키지에 대한 설명이나 문서를을 붙이고 싶을 때 사용한다.
  • 예를 들어, 아래와 같이 패키지에 속한 모든 클래스들의 공통 목적이나 사용 방법을 정리한다.
/**
 * 이 패키지는 사용자 인증과 관련된 기능을 제공합니다.
 * - User 객체 관리
 * - 로그인/로그아웃 기능
 * - 세션 처리
 */
package com.example.auth;

1.2 패키지 레벨 어노테이션

특정 패키지에 공통적으로 적용할 어노테이션을 선언할 때도 package.info 파일이 쓰인다. 즉, 패키지에 대한 공통 규칙 선언 파일이다.

자바에서는 기본적으로 특별히 제한을 두지 않으면 필드, 파라미터, 반환값에 기본적으로 null을 허용한다. 아무런 어노테이션이 없으면 전부 null 값이 들어올 수 있는데 이것을 컴파일러가 막아주지 않기 때문에 개발자가 직접 null 체크를 해야 하는 불편함이 있다. 그래서 나온 방법이 패키지 레벨에서 공통 규칙을 선언하는 것이다. 이것을 선언하는 공간이 package-info.java이다.

예를 들어, @NonnullByDefault 같은 어노테이션을 패키지 전체에 적용할 수 있다.

@ParametersAreNonnullByDefault
package com.example.service;

import javax.annotation.ParametersAreNonnullByDefault;

이렇게 하면 com.example.service 패키지 안에서는 모든 메서드 파라미터는 기본적으로 null이 될 수 없다고 가정한다.
만약 정말 null을 허용하고 싶으면 그때만 @Nullable을 따로 붙이면 된다. 예전에는 “null일 수도 있다”를 매번 @NonNull로 표시해야 했다면, 이제는 “기본은 null 아님”이라고 선언하고, 정말 null일 수 있는 경우만 따로 표시하면 되는 것이다.

스프링에서는 비슷하게 @NonNullApi, @NonNullFields를 제공한다.

  • @NonNullApi: 파라미터랑 반환값은 기본적으로 null 불가
  • @NonNullFields: 필드는 기본적으로 null 불가
  • 이 경우 파라미터나 반환값이 Null이 아니어야 되는 상황에서는 @NonNullApi 애노테이션을, 필드가 Null이 아니어야 되는 상황에서는 @NonNullFields 애노테이션을 package-info.java 파일에 적용하면 된다.
@NonNullApi
@NonNullFields
package com.example.service;

import org.springframework.lang.NonNullApi;
import org.springframework.lang.NonNullFields;