[Spring] Spring 관련 키워드 간단 정리
Note : 이 글은 지극히 주관적인 생각을 토대로 작성된 글입니다. 혹시나 잘못된 부분이 있다면 메일 또는 코멘트를 통해 알려주시면 감사하겠습니다. 😄 제 메일은 About 탭에서 확인하실 수 있습니다. 📧
P.S : 이 페이지는 웹에 최적화 된 페이지입니다. 가급적 모바일이 아닌 웹에서 보시는 것을 추천드립니다.
작성자 TMI
최근부터 포스팅이 조금씩 저조해짐을 느끼고, 그래도 이전보다는 시간이 조금씩 생기는 것 같아서 복습도 할 겸 예전에 공부했던 내용과 최근에 새롭게 공부하는 내용 위주로 포스팅을 조금씩 작성해보려고 한다. 이 글이 그 시작의 포스팅이 될 것 같다. 포스팅 작성을 얼마나 오래 해나갈지는 모르겠지만, 최대한 습관을 들이고자 한다. 꼭 Spring
또는 백-앤드 기술에 국한되지도 않고, 다양한 기술 분야도 다루고자 한다. 본인 스스로가 기초가 많이 부족하기 때문에 다른 기술 공부도 필요하기 때문이다.
그리고 내 블로그에 올라온 포스팅을 읽는 사람은 많이 없겠지만 혹시나 적어두자면 이전에 작성하던 컨퍼런스 후기나 알고리즘 문제 풀이, 읽었던 도서 후기 관련 포스팅도 여전히 그대로 올라갈 것이다. 다만 조금 여유롭게 작성하는 편이라 그 주기가 일정하지는 않을 것 같다.
Intro..
이번 포스팅에서는 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
를 의미한다. -
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
를 의미한다.
마치며
이번 포스팅에서는 Spring
을 처음 공부할 때 많이 낯설었던 키워드나 용어 위주로 간단하게 정리해보았다. 이번 포스팅에서 다루었던 키워드 중에 일부는 더 자세한 포스팅을 통해서 더 자세하게 다룰 예정이 있으나, 최대한 빠른 시일 내는 아닐 거다.. 시간 날 때 천천히 포스팅 할 생각이다. 이번 포스팅에서 다루었던 용어 또는 키워드 중에서 더 자세하게 알고 싶은 내용이 있다면 관련 키워드로 구글에서 자료를 찾아보면 더 깊은 내용을 다루고 있는 레퍼런스를 어렵지 않게 찾아볼 수 있을 것이다. 여기서는 일단 간단하게 정리하는 것이 주된 목적이었으니, 그렇게까지 깊게 다루진 않았다. (깊게 다루는 게 결코 귀찮지는 않았다..) 이번 포스팅은 여기서 마무리하고 다음에 관련 내용 또는 다른 내용으로 새로운 포스팅을 작성해보겠다.