[SPRING] 자주 쓰이는 기능 (어노테이션, 라이브러리) 정리

시작하기 전에

대부분 국내 프로젝트는 스프링 프레임워크 기반의 자바 언어로 프로젝트가 이루어져 있다.

대세인 다른 언어들이 많이 있지만, 스프링 하나만 잘 알아도 국내 프로젝트에 투입되는데 문제없다는 걸 자주 들었다.

개발을 하다보면 반복적인 로직과 구글링에 의한 복사 붙여넣기가 생각 이상으로 많다.

 

오늘 알아볼 내용은 스프링 기반의 프로젝트에서 자주 사용되는 어노테이션과 메이븐 라이브러리(의존성)에 대하여

정리를 하고자 한다.

 

기본 개념

스프링에서의 어노테이션이란

스프링은 자바 기반의 프레임워크인데, 내장 기능으로 제공되는 어노테이션은
가독성에 요점을 두어, 직관적인 주석의 역할 + 관련 소스가 자동으로 생성 및 관리를 한다.

 

라이브러리 vs 의존성

라이브러리란, 특정 기능의 사용을 재사용가능한 코드의 집합체 형태(클래스/함수/모듈)로 이루어진 것.
의존성이란, 한 소프트웨어가 다른 요소에 의존하는 관계. 주로 외부 라이브러리/프레임워크/모듈 등이 포함이 된다.
외부에서 라이브러리나 프레임워크를 사용하여 프로젝트에 기능을 확장시키고, 진행 중인 프로젝트에 포함시킬 때의 관계를 의미한다.

쉽게 말해, 라이브러리 < 의존성을 의미한다.
외부에서 라이브러리를 추가하고, 해당 라이브러리가 의존하는 다른 라이브러리를 자동으로 동시에 가져온다는 의미로 해석하면 된다.

 

어노테이션

표준 어노테이션 정리

자바에서 제공되는 표준 어노테이션은 자바SD(Standard Edition) 또는 EE(Enterprise Edition)에서 사용된다.
사용되는 주요 목록은 아래와 같다.

더보기
  • @Override : 해당 메서드가 상위 파일(부모 클래스 또는 인터페이스)의 메서드를 오버라이드(상속)할 때
  • @Deprecated : 해당 요소(클래스, 메서드 등)이 (버전업 등의 문제로) 더 이상 사용을 권장하지 않을 때 
  • @SuppressWarnings : 컴파일러에게 해당 요소에서 발생되는 특정 경고들을 무시하고자 할 때
  • @SafeVarags : (동적 매개변수)가변인자 메서드에서 타입 안전성 경고를 무시할 때
  • @FunctionallInterface : 함수형 인터페이스를 선언할 때, 해당 인터페이스가 하나의 추상 메서드만 가지도록 할때 (주로 람다 표현식과 함께) 사용된다.
  • @SuppressWarnings : 어노테이션 요소의 데이터 유형이나 반환 유형 등을 설정할 때
  • @Retention : 어노테이션의 유지 정책을 지정할 때 (소스 코드에서만 유지할지/ 컴파일된 클래스 파일까지 유지할지/ 실행 중에도 유지할지를 설정한다)
  • @Target : 어노테이션을 어디에 적용할 수 있는지를 지정할 때 (클래스, 메서드, 필드 등의 다양한 대상에 어노테이션을 적용할 수 있다)
  • @Documented : 해당 어노테이션이 javadoc에 포함되어 문서화되어야 함을 나타낼 때
  • @Inherited : 어노테이션이 상속될 수 있도록 지정할 때 (부모 클래스에서 어노테이션을 사용하면 하위 클래스에서도 상속되도록 한다)
  • @EJB : Enterprise JavaBeans(컴포넌트 기반 아키텍처)를 주입할 때
  • @WebService : 웹 서비스의 엔드포인트를 나타낼 때

 

실무에서 자주 사용되는 어노테이션 정리

표준 어노테이션 정리에서 소개된 내용을 제외하고, 실무에서 자주 사용되는 어노테이션들도 각 기능이나 환경 별로 몇 가지가 있어서 정리를 하였다.

더보기

스프링 프레임워크 어노테이션

  • @SpringBootApplication : 스프링 부트 애플리케이션의 주 진입점 클래스를 나타낸다.
  • @Controller : 컨트롤러 역할을 하는 클래스를 나타낸다
  • @Service : 서비스 역할을 하는 클래스를 나타낸다
  • @Repository : 리포지토리 역할을 하는 클래스를 나타낸다
  • @RequestMapping : HTTP요청과 클래스/메서드를 매핑하여 웹 요청을 처리하는데 사용하는 매핑 경로
  • @Component : 해당 클래스를 스프링 빈으로 등록한다 (스프링이 런타임시 컴포넌트스캔으로 자동으로 빈을 찾고 등록한다)
  • @Bean : 해당 메서드를 스프링 빈으로 등록한다 (반환되는 객체(인스턴스)를 개발자가 수동으로 빈으로 등록한다)
  • @Autowired : 의존성 주입을 수행하는데 사용한다
  • @Transactional : 해당 메서드에서 트랜잭션 설정할 때 사용한다
  • @Value : 설정 파일(.properties, .yml)에 설정한 내용을 주입시킬 때 사용한다.
 
 
Spring Boot 어노테이션
  • @SpringBootApplication : 스프링 부트 애플리케이션의 주 진입점 클래스를 나타낸다.
  • @RestController : RESTful 웹 서비스의 컨트롤러 클래스를 나타낸다. 
 
JPA(Hibernate) 어노테이션
 
  • @Entity : JPA엔터티 클래스임을 나타낸다
  • @Table : 엔터티가 매핑될 데이터베이스 테이블을 지정한다.
  • @Id : 엔터티의 기본 키 필드를 지정한다.
  • @GeneratedValue : 기본 키의 자동 생성 전략을 지정한다.
 
JUnit 테스트 어노테이션
  • @Test : 해당 메서드가 테스트 메서드임을 나타낸다.
  • @ Before: 테스트 메서드 실행 전에 실행할 메서드를 지정한다.
  • @ After: 테스트 메서드 실행 후에 실행할 메서드를 지정한다.
Lombok 어노테이션
  • @Getter : 자동으로 getter 메서드를 생성한다.
  • @Setter : 자동으로 setter 메서드를 생성한다.
  • @NoArgsConstructor : 인자가 없는 생성자를 인자로 받는 생성자를 생성한다.
  • @AllArgsConstructor : 모든 필드를 인자로 받는 생성자를 생성한다.
  • @Slf4j : 해당 클래스/메서드에서 slf4j 로그 프레임워크 코드 간소화
 

라이브러리

표준 라이브러리 정리

메이븐에서 자주 사용되는 표준 라이브러리들은 다음과 같다.

더보기

1. JUnit : 자바 어플리케이션의 단위 테스트를 위한 테스트 프레임워크  
<dependency>
    <groupId>junit</groupId>
    <artifactId>junit</artifactId>
    <version>선택한 버전으로</version>
    <scope>필요시 적용</scope>
</dependency>
 

2. Log4j : 자바 어플리케이션의 로깅을 위한 자바 라이브러리 (로깅을 효율적으로 관리)
<dependency>
    <groupId>log4j</groupId>
    <artifactId>log4j 또는 log4j-api 또는 log4j-core</artifactId>
    <version>선택한 버전으로</version>
    <scope>필요시 적용</scope>
</dependency>

3. SLF4J : 다양한 로깅 프레임워크에 대한 추상화 계층을 제공하여 로깅 시스템을 간편하게 교체하는 로깅 퍼사드(프레임워크)
<dependency>
    <groupId>org.slf4j</groupId>
    <artifactId>slf4j-api</artifactId>
    <version>선택한 버전으로</version>
    <scope>필요시 적용</scope>
</dependency>

3. SLF4J : 다양한 로깅 프레임워크에 대한 추상화 계층을 제공하여 로깅 시스템을 간편하게 교체하는 로깅 퍼사드(프레임워크)
<dependency>
    <groupId>org.slf4j</groupId>
    <artifactId>slf4j-api</artifactId>
    <version>선택한 버전으로</version>
    <scope>필요시 적용</scope>
</dependency>

4. Apache Commons : 다양한 유틸리티 및 기능을 제공하는 라이브러리 모음 (파일 조작, 문자열 조작, 컬렉션 등)
<dependency>
    <groupId>org.apache.commons</groupId>
    <artifactId> commons-lang3, commons-io 등을 적용</artifactId> 
    <version>선택한 버전으로</version>
    <scope>필요시 적용</scope>
</dependency>

5. Apache Commons Beans : 자바 빈을 다루는데 유용한 유틸리티.
<dependency>
    <groupId>commons-beanutils </groupId>
    <artifactId>commons-beanutils</artifactId>
    <version>선택한 버전으로</version>
    <scope>필요시 적용</scope>
</dependency>

6. Jackson : JSON 데이터를 자바 객체로 매핑하는데 사용되는 라이브러리
<dependency>
    <groupId> http://m.fasterxml.jackson.core</groupId>
    <artifactId>jackson-databind</artifactId>
    <version>선택한 버전으로</version>
    <scope>필요시 적용</scope>
</dependency>

<dependency>
    <groupId>org.codehaus.jackson</groupId>
    <artifactId>jackson-core-asl</artifactId>

    <version>선택한 버전으로</version>
    <scope>필요시 적용</scope>
</dependency>

7. Gson : JSON데이터를 자바 객체로 변환하거나 반대로 변환하는 등의 기능이 제공되는 라이브러리
<dependency>
    <groupId> com.google.code.gson</groupId>
    <artifactId>gson</artifactId>
    <version>선택한 버전으로</version>
    <scope>필요시 적용</scope>
</dependency>

8. Apache HttpClient : HTTP프로토콜을 사용하여 통신하는데 사용되는 라이브러리 (다양한 HTTP메서드 및 요청/응답 처리기능이 제공된다)
<dependency>
    <groupId> org.apache.httpcomponents </groupId>
    <artifactId>httpclient</artifactId>
    <version>선택한 버전으로</version>
    <scope>필요시 적용</scope>
</dependency>

9. Spring Framework : 스프링은 다양한 모듈을 포함한 포괄적인 경량 애플리케이션 개발 프레임워크로, 의존성주입 (Dependency Injection), 관점 지향 프로그래밍 (Aspect-Oriented Programming)등을 지원한다
<dependency>
    <groupId>  org.springframework  </groupId>
    <artifactId>선택한 아키텍처 아이디로</artifactId>
    <version>선택한 버전으로</version>

    <scope>필요시 적용</scope>
</dependency>

10. Hibernate (ORM) : 다양한 데이터베이스와의 상호작용을 위한 객체 관계 매핑(ORM)을 제공하는 프레임워크로 데이터베이스와 자바 객체간의 매핑을 편리하게처리한다.
<dependency>
    <groupId>  org.hibernate</groupId>
    <artifactId>선택한 아키텍처 아이디로</artifactId>
    <version>선택한 버전으로</version>
    <scope>필요시 적용</scope>
</dependency>

11. JDBC : 각 언어 별 JDBC 드라이브 
<dependency>

    <groupId>com.oracle.database.jdbc</groupId>
    <artifactId>ojdbc8</artifactId>
    <version>선택한 버전으로</version>
    <scope>필요시 적용</scope>
</dependency>
<dependency>
    <groupId>com.microsoft.sqlserver</groupId>
    <artifactId>mssql-jdbc</artifactId>
    <version>선택한 버전으로</version>
    <scope>필요시 적용</scope>
</dependency>

 

실무에서 자주 사용되는 라이브러리 정리

일반적으로 실무에서 사용되는 주요 메이븐 라이브러리는 아래와 같다.

더보기

[스프링 프레임워크 라이브러리]
Spring Core : 스프링의 핵심 기능을 제공하는 라이브러리이다.
<dependency>
     <groupId>org.springframework</groupId>
     <artifactId>spring-core</artifactId>
     <version>5.x.x</version>
</dependency>

Spring Web : 스프링 웹 모듈로, 웹 애플리케이션 개발에 필요한 기능을 제공한다.
<dependency>
     <groupId>org.springframework</groupId>
     <artifactId>s[romg=web</artifactId>
     <version>5.x.x</version>
</dependency>

Spring bootstarter : 스프링 부트 프로젝트를 시작하기 위한 의존성을 제공한다.
<dependency>
     <groupId>org.springframework</groupId>
     <artifactId>spring-boot-starter</artifactId>
     <version>2.x.x</version>
</dependency>

[ Hibernate ORM 라이브러리]
Hibernate Core : 객체-관계 매핑(ORM)을 위한 라이브러리이다.
<dependency>
     <groupId>org.hibernate</groupId>
     <artifactId>hibernate-core</artifactId>
     <version>5.x.x</version>
</dependency>

[ Apache Commons 라이브러리]
Apache Commons Lang : 다양한 유틸리티 메서드를 제공한다.
<dependency>

     <groupId>org.apache.commons</groupId>
     <artifactId>commons-lang3</artifactId>
     <version>3.x</version>
</dependency>

Apache Commons IO : 파일 및 IO작업을 위한 유틸리티이다.
<dependency>
     <groupId>commons-io</groupId>
     <artifactId>commons-io</artifactId>
     <version>2.x</version>
</dependency>

[ Slf4j 및 Logback 라이브러리]
Slf4j API : 간단한 로깅 퍼사드이다.
<dependency>
     <groupId>org.slf4j</groupId>

     <artifactId>slf4j-api</artifactId>
     <version>1.7.x</version>
</dependency>

Logback : slf4j를 위한 로깅 구현체이다.
<dependency>

     <groupId>org.logback</groupId>
     <artifactId>logback-classic</artifactId>
     <version>1.2.x</version>
</dependency>

[ JUnit 라이브러리]
JUnitI : 자바 단위 테스트 프레임워크
<dependency>

     <groupId>org.slf4j</groupId>
     <artifactId>slf4j-api</artifactId>
     <version>1.7.x</version>
</dependency>

 

결론적으로

자주 사용되는 어노테이션과 메이븐은 서로 연관되어 있는 기능들이 많이 있다.

개발을 하다보면서 마주하는 주요 기능들에 대하여는 개인적으로 좀 더 자세하게 공부해야할 필요가 있어보인다.