🔑10분만.. 10분만.. 10분만 더 앉아있자
💡 어노테이션이란?
📃 Java 5 버전부터 추가된 기능으로, 소스코드에 추가적인 정보를 제공하는 메타데이터의 기능을 수행합니다. (메타데이터는 데이터의 데이터를 의미하죠!) 어노테이션은 클래스, 메소드, 변수, 인자 등에 추가할 수 있습니다. 그래서 어노테이션은 비즈니스 로직에 직접적으로 영향을 주진 않지만, 이러한 메타데이터 정보에 따라서 실행 흐름을 변경할 수 있습니다
💻Annotation
@Override @Deprecated @SuppressWarnings -> Built-in
@Retention @Documented @Target @Inherited @Repeatable -> Meta
⬆️ Built-in 어노테이션은 "자바 코드에 직접적으로 적용되는 어노테이션"입니다. Meta 어노테이션은 "어노테이션을 위한 어노테이션"입니다. 그래서 우리가 어노테이션을 커스텀마이징을 진행하려 한다면 알고있어야합니다
💡 Meta Annotation (@Retention)
📃 "어노테이션을 위한 어노테이션"이라는 말이 좀 와닿지 않을 수 있습니다. 지금은 아니지만 우리도 언제간 어노테이션을 정의해서 사용할때가 있을 것 입니다. 그때 정의하는 과정에서 @Retention이라는 어노테이션을 통해 해당 어노테이션의 정보를 어느 범위까지 유지할 것인지를 설정해줄 수 있습니다
💻@Retention
@Retention
1. RetentionPolicy.SOURCE
2. RetentionPolicy.CLASS
3. RetentionPolicy.RUNTIME
⬆️ 각각 정의하는 어노테이션의 유지 정책을 지정합니다
1️⃣ SOURCE는 컴파일 전까지만 유효하며 컴파일 이후에는 사라지도록 지정
2️⃣ CLASS 컴파일러가 클래스를 참조할 때까지 유효합니다. 즉 바이트코드에 포함되지만 런타임에는 사용 불가합니다
3️⃣ RUNTIME 리플랙션을 사용하여 컴파일 이후에도 JVM에 의해 계속 참조됩니다
💡 @Target 어노테이션
📃 해당 어노테이션이 사용될 수 있는 위치를 설정합니다
💻@Target
ElementType.PACKAGE
ElementType.TYPE
ElementType.CONSTRUCTOR
ElementType.FIELD
ElementType.METHOD
ElementType.ANNOTATION_TYPE
ElementType.LOCAL_VARIABLE
ElementType.TYPE_PARAMETER
⬆️ 그냥 한눈에 봐도 알 수 있겠죠? 패키지, 타입, 생성자, 맴버 변수, 메서드, 어노테이션, 지역 변수, 매개 변수와 같은 타입 선언 시 사용될 수 있도록 정의합니다
💡 @Documented @Inherited @Repeatable
📃 그 외에도 사용되는 메타 어노테이션들이 존재합니다.
💻기타 어노테이션
@Documented
- 해당 어노테이션이 Javadoc에 포함되도록 지정합니다
- 어노테이션이 코드 문서화에 중요한 경우 사용됩니다
@Inherited
- 어노테이션이 자식 클래스에 자동으로 상속되도록 설정합니다
- 클래스에만 적용 가능하며, 메서드나 필드에는 적용되지 않습니다
@Repeatable
- 동일한 어노테이션을 한 곳에 여러 번 사용할 수 있도록 설정합니다
- Java 8부터 지원되며, 이를 사용하려면 컨테이너 어노테이션이 필요합니다
💡 Maven 빌드 관리 도구
📃 Maven과 Gradle은 프로젝트에서 필요한 XML, properties, JAR 파일 등을 자동으로 관리하며 빌드 작업을 돕는 도구입니다. 이들은 다음과 같은 주요 작업을 수행합니다:
- 소스 코드 컴파일
- 테스트 수행 및 정적 분석
- 실행 가능한 애플리케이션으로 빌드
- 프로젝트 정보 관리
- 배포 작업 자동화
특히, 가장 큰 장점은 외부 라이브러리를 자동으로 관리한다는 점입니다.
이것이 왜 큰 장점이냐 하면, 이전에는 외부 라이브러리를 사용하기 위해:
- 각 라이브러리를 개별적으로 찾아 다운로드
- 버전을 수동으로 확인 및 관리
이와 같은 과정을 모두 개발자가 직접 수행해야 했습니다. 하지만 Maven과 Gradle은 외부 라이브러리를 자동으로 다운로드 및 업데이트하며, 버전 충돌이나 관리 문제를 해결해줍니다.
💡 메이븐 Maven 이란
📃 자바의 대표적인 관리 도구였던 Ant를 대체하기 위해서 개발되었고, 프로젝트의 외부 라이브러리를 쉽게 참조할 수 있게 pom.xml 파일로 명시하여 관리합니다
💻Ant vs Maven
Ant
1. XML 기반의 빌드 스크립트
2. 간단하고 사용하기 쉽다
3. 자유로운 빌드 단위 지정
4. 대규모 프로젝트에서 복잡해지는 경향이 있다
5. 라이프 사이클이 없다
Maven
1. XML 기반의 빌드 스크립트
2. 라이프 사이클 도입
3. pom.xml로 편하게 Dependency관리
⬆️ 기존에 사용되던 Ant는 빌드의 기능만 가지고 있었던 것에 비해 Maven은 언급했듯이 자동으로 라이브러리를 관리해주는 기능이 추가되었습니다
💡 메이븐 Maven 대표 태그 설명
📃 메이븐 pom.xml 파일 스크립트에서 사용되는 대표적인 태그들 입니다
1️⃣ modelVersion: maven의 버전을 의미
2️⃣ groupId: 프로젝트 그룹 id를 뜻하며, 일반적으로 대표하는 사이트 도메인을 역순으로 적어서 사용 ex) naver.com -> com.naver
3️⃣ artifactId: groupId외에 다른 프로젝트와는 구분될 수 있는 프로젝트의 Id를 작성
4️⃣ version: 프로젝트의 버전을 의미하며 개발 단계에 따라 구분하여 작성
5️⃣ name: 프로젝트의 이름
6️⃣ description: 해당 프로젝트의 간략한 설명을 작성
7️⃣ properties: pom.xml 파일 내에서 빈번하게 사용되는 중복 상수를 정의하는 영역 해당 영역의 상수를 사용하기 위해서는 ${태그명}의 형태로 사용하면 됨
8️⃣ dependendies: 해당 프로젝트에서 의존성을 가지고 사용하는 라이브러리를 정의하는 영역, 각 라이브러리마다 <dependency> 태그를 사용하여 구분
9️⃣ build: 프로젝트 빌드와 관련된 정보를 설정하는 영역