이번 포스팅에서는 Spring과 관련된 키워드를 간단하게 정리하고자 한다. 예전에 내가 처음 스프링과 스프링 부트를 공부할 때 Java에 대한 기본적인 지식은 있었지만 그렇다 하더라도 모르는 용어나 키워드가 너무 많았다. 물론 처음이라서 그렇겠지만 내용을 읽을 때마다 모르는 용어나 키워드가 절반 이상이어서 그런 키워드나 용어가 무엇을 의미하는지 알아보는 데에도 꽤 시간을 들였던 것 같다. 그렇기에 나처럼 스프링과 스프링 부트를 공부할 때 낯선 용어나 처음 보는 키워드가 많아서 당황할 사람들(물론 없을 수도 있다.. 나만 기초가 부족했을 수도..)을 위해서 간단하게 Spring 관련 키워드나 용어를 정리해서 작성해보려고 한다.
Dependency
- Dependency(또는 의존성)는 코드에서 두 모듈간의 연결이라고 볼 수 있다. 객체 지향 언어에서는 두 클래스간의 관계라고도 말한다.
- 일반적으로 둘 중 하나가 다른 하나를 어떤 용도를 위해 사용한다. 간단히 생성자 호출인 new 연산자가 될 수 있다.
- 클래스 내에서 개발자가 객체를 직접 관리(생성 및 조작)할 경우, 의존성이 나타나게 된다.
- A 클래스와 B 클래스와 C 클래스가 있다고 가정하면, A 클래스 내에서 B 객체와 C 객체를 생성할 경우, A 객체는 B 객체와 C 객체를 사용함과 동시에 의존한다 라는 의미를 가진다.
public class A {
public A () {
B b = new B();
C c = new C();
}
}
위와 같은 경우, A 객체는 B 객체와 C 객체에 의존하게 되는 경우가 생긴다. 이런 의존성이 위험한 이유는 다음과 같다.
Dependency가 위험한 이유
의존성이 강하면 강할수록, 상호적으로 결합이 생기고, 결합이 강해지면 클래스간의 관계가 복잡해지고 쉽사리 변경하기가 쉽지가 않다.
두 코드가 서로를 종속하고 있기 때문에 변경에 대한 작업이 어려워진다.
A 객체에서 다른 객체를 사용한다고 했을 때 테스트를 한다고 해보자. 테스트가 실패했을 때 현재 객체에서의 실패일까? 아니면 의존하는 객체의 실패일까?
알 수 없다. 이게 클래스 별로 상당한 양의 코드라면 이건 꽤 심각한 문제가 된다.
하나의 모듈이 바뀌면 현재 모듈을 의존하고 있는 다른 모듈까지 변경이 이루어지기 때문이다.
D.I(Dependency Injection)
- A 클래스가 B와 C 객체에 의존하고 있는 상황일 때, 직접 A 클래스 내에서 B 객체와 C 객체를 생성하는 것이 아니라, 외부에서 B 객체와 C 객체를 생성한 다음 A 클래스에 주입하는 방법이다.
- 의존 객체를 외부에서 직접 생성해서 주입하는 형태를 의존성 주입이라고 한다.
- 그렇게 할 경우, 외부(프레임워크)에 의해 의존 객체가 동적으로 주입되므로, 여러 객체간의 결합(의존도)이 줄어든다.
- 의존성 주입을 위해서는 객체를 생성하고 넘겨주는 외부의 무언가가 필요하게 되는데, 우리는 Spring Framework에서 이를 해결한다.
- 의존 객체를 생성하고 주입시켜 주는 곳이 Spring에서는 Bean Container가 된다.
Dependency Injection의 장점
- 종속성(의존성)이 줄어든다.종속성이 줄어드므로, 변경에 민감하지가 않다.
- 재사용성이 증가한다. 다른 클래스에서도 이러한 의존 객체가 필요한 경우, Bean 컨테이너에서 의존 객체를 주입해줄 수 있다.
- 테스트 코드를 작성하는것에 대한 불편함이 줄어든다.
- 코드의 가독성이 올라간다.
Build
소스코드 파일을 컴퓨터에서 실행시킬 수 있도록 가공하는 것, 실행가능한 파일로 만드는 것을 의미한다.
Redis
오픈소스 기반의 비관계형 데이터베이스 관리 시스템을 의미한다. 주로 캐시 용도로 많이 사용하고 있다.
JDBC
Java에서 데이터베이스에 접근할 수 있는 Java 인터페이스를 의미한다.
REST API
웹 설계의 우수성을 제대로 사용하기 위한 Architecture인 REST를 기반으로 설계된 API를 의미한다.
프레임워크
소프트웨어에서 특정 문제를 해결하기 위해 상호 협력하는 클래스와 인터페이스의 집합체를 의미한다.
프로그램 설계를 위하여 일관된 방법이나 설계를 제공하는 환경을 의미하기도 한다.
어떠한 목적을 달성하기 위해 복잡하게 얽혀있는 문제를 해결하기 위한 구조이며, 소프트웨어 개발에 있어 하나의 뼈대 역할을 한다.
라이브러리와의 차이점
프레임워크라고 하면, 클래스와 라이브러리가 합쳐진 형태라고 볼 수 있다.
메소드 및 클래스화, 즉 모듈화를 하는 이유 중 하나가 재사용성인데, 프레임워크는 이 재사용성을 큰 그룹단위로 묶어주었다고 보면 된다.
재사용 가능한 수많은 클래스들과 라이브러리들을 처음부터 융합한 채로 제공해 주기 떄문에, 여러 개의 표준을 만들지 않아도 되서 개발자의 피곤함을 덜어준다.
JPA(Java Persistent API)
- 애플리케이션과 JDBC 사이에서 동작하는 도구를 의미한다.
- 자바 플랫폼 SE와 EE를 사용하는 응용 프로그램에서 관계형 데이터베이스의 관리를 표현하는 Java API이다.
- 기존에 EJB에서 제공되던 Entity Bean을 대체하는 기술이다.
- ORM 표준 기술로 Hibernate, OpenJPA, EclipseLink, TopLink Essentials과 같은 구현체가 있고 이에 표준 인터페이스가 바로 JPA이다.
- ORM(Object Relational Mapping)이란, 데이터베이스와 객체 지향 프로그래밍 언어 간의 호환되지 않는 데이터 변환 기법이다. 쉽게 얘기하면 RDB 테이블을 객체 지향적으로 사용하기 위한 기술이다.
- RDB 테이블은 객체 지향적 특징(상속, 다형성, 레퍼런스, 오브젝트 등)이 없고 Java와 같은 언어로 접근하기 쉽지 않다.
- 때문에 ORM을 사용해 오브젝트와 RDB 사이에 존재하는 개념과 접근을 객체 지향적으로 다루기 위한 기술이다.
Gradle(Build Tool)
- 소스 코드로부터 배포 가능한 산출물을 빌드하는 Build Tool 또는 프로젝트 관리 도구의 종류 중 하나이다.
- Gradle은 Ant의 유용성과 Maven의 편리성을 조합해서 만든 Build Tool이다.
- API 제공 및 확장성이 좋다.
- 빌드의 구조화를 제공하고, Muilti-Project 빌드를 쉽게할 수 있도록 제공한다.
- Groovy DSL(Domain Specific Language) 기반으로 되어 있다.
- 빌드 스크립트는 기존 XML이 아닌 Groovy 방식으로 작성되어 있다.
REST Controller
- REST(Representational State Transfer)에 대해서는 추후 자세히 다루겠지만, 간단하게 얘기하면 하나의 URI는 하나의 고유한 Resource를 대표하도록 설계된다는 개념이다.
- REST 방식으로 API가 설계되면 특정한 URI는 반드시 그에 상응하는 데이터 자체라는 것을 의미한다.
- /book/123은 123번째 book이라는 고유한 의미를 가지고 있는 URI로 인식된다. 이에 대한 처리는 GET, POST와 같은 HTTP Method를 통해 처리된다.
- REST API는 외부에서 위와 같은 방식으로 특정 URI를 통해서 사용자가 원하는 정보를 제공하는 방식이다.
- REST 방식의 서비스 제공이 가능한 API를 Restful하다고 표현한다.
- Spring 3부터 @Repository라는 어노테이션을 지원하면서 REST 방식의 처리를 지원하고 있었으며, Spring 4에 들어와서 @RestController라는 어노테이션이 본격적으로 소개되었다.
@RestController
- 특정한 JSP와 같은 뷰를 만들어내는 것이 아닌 REST 방식의 데이터 자체를 서비스하는 것을 말한다.
- @Controller + @Repository의 축약형으로써, 리턴값을 View Resolver로 매핑하지 않고 그대로 출력해준다.
- @RestController라는 어노테이션을 Controller에 지정하면, 해당 컨트롤러의 모든 메소드는 자동적으로 @Responsebody 어노테이션이 적용되어 동작한다.
- @RestController가 적용된 컨트롤러의 모든 메소드는 JSP등의 뷰를 생성하지 않고, 데이터만 반환하게 된다.
반환되는 데이터는 크게 문자열, JSON, XML 등으로 나뉜다. - @Controller와 Restful 컨트롤러인 @RestController의 차이점은 HTTP Response Body가 생성되는 방식이다.
- @Controller는 View Page를 반환하지만, @RestController는 객체(VO, DTO)를 반환하기만 하면, 객체 데이터는 application/json 형식으로 HTTP Response Body를 통해 데이터를 반환한다.
@GetMapping
@RequestMapping(method = RequestMehtod.GET)의 축약형으로써, 어노테이션만 보고 무슨 메소드 요청인지 바로 알아볼 수 있다.
@GetMapping은 요청 URL을 어떠한 메서드가 처리할 지 매핑한다.
Controller 내부에서 URI 경로를 지정하는 역할도 한다.
YAML(YAML Ain’t Markup Language)
“사람이 쉽게 읽을 수 있는” 데이터 직렬화 양식 또는 포맷을 의미한다.
XML, JSON과 같이 가독성을 염두해 두고 설계된 포맷이다.
Spring에서는 주로 Config 또는 외부 프로퍼티 값 관련 설정 파일을 작성할 때 가독성을 높이기 위해 YAML 양식을 사용한다.
@Value
외부 Property의 키 값을 사용하여 특정한 값을 외부에서 호출할 수 있다.
YAML 파일에서 설정한 키 값을 @Value의 프로퍼티 값으로 주면 해당 값이 필드 값에 할당되는 방식으로 사용한다.
단일 필드 값을 가져오는데 주로 사용한다.
공통 값들을 정의해 놓은 파일(YAML)에 접근하여 원하는 데이터를 읽어와서 사용한다.
@ConfigurationProperties
다양한 형태의 프로퍼티 값을 매핑할 수 있다.
@Value와 마찬가지로 YAML 파일에 접근하여 원하는 데이터를 읽어오는 것은 동일하나, 특정한 값(단일 필드)을 가져오는 것이 아닌, 기본적으로 접두사를 사용하여 값을 바인딩한다.
@ConfigurationProperties는 유연한 바인딩(다양한 형식으로 선언하여 바인딩)이 가능하다.
Spring Bean
간단하게 얘기하면, Spring Bean은 자바의 객체이다.
스프링 컨테이너(Spring Container)에 의해서 자바 객체가 만들어 지게 되면 이 객체를 스프링은 Spring Bean이라고 부른다.
Spring Bean과 일반 Java 객체와 차이점은 없다.
Spring Container에서 만들어지는 객체를 Spring Bean이라고 부를 뿐이다.
Spring IoC Container에 의해 관리되며 Spring 제어권을 가지고 관계를 부여하는 객체를 의미하기도 한다.
Spring Container는 빈의 생성 주기, 관계, 사용 동의 설정을 제어한다.
의존 객체를 모아두는 곳이 Spring(Bean) Container이고, 컨테이너에서 의존 객체를 관리한다.
Spring Boot Starter
다양한 애플리케이션에 포함되는 편리한 의존성 집합체를 의미한다.
스프링 부트는 관련 의존성을 스타터라는 묶음으로 제공하여 수동 설정을 지양한다.
@Data
클래스안의 모든 private 필드에 대해 @Getter와 @Setter를 적용하여 getter/setter를 만들어준다.
클래스 내에 @ToString과 EqualsAndHashCode를 적용시켜 메서드를 오버라이딩 해주며 @RequiredArgsConstructor를 지정해 준다.
@Component
Spring의 @Repository, @Service 및 @Controller가 관리하는 구성 요소에 대한 일반 스테레오 타입을 의미한다.
MVC의 구성 요소를 나타내는 일반 주석이다.
주석 된 Bean을 스캔하여 D.I 컨테이너에서 사용할 수 있게 해주는 최상위 일반 주석이다.
Annotation
인터페이스를 기반으로 한 어떠한 기능을 주입하는데에 사용되는 키워드를 의미한다.
H2
Java로 작성된 In Memory RDBMS를 의미한다.
'BE > Spring' 카테고리의 다른 글
스프링 프로젝트 시 참고순서 (0) | 2023.04.09 |
---|---|
@PathVariable 과 @RequestParam 이란? (0) | 2023.04.05 |
포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!