/ POSTS

[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 클래스가 BC 객체에 의존하고 있는 상황일 때, 직접 A 클래스 내에서 B 객체와 C 객체를 생성하는 것이 아니라, 외부에서 B 객체와 C 객체를 생성한 다음 A 클래스에 주입하는 방법이다.

  • 의존 객체를 외부에서 직접 생성해서 주입하는 형태를 의존성 주입이라고 한다.

  • 그렇게 할 경우, 외부(프레임워크)에 의해 의존 객체가 동적으로 주입되므로, 여러 객체간의 결합(의존도)이 줄어든다.

  • 의존성 주입을 위해서는 객체를 생성하고 넘겨주는 외부의 무언가가 필요하게 되는데, 우리는 Spring Framework에서 이를 해결한다.

  • 의존 객체를 생성하고 주입시켜 주는 곳이 Spring에서는 Bean Container가 된다.

  • Dependency Injection의 장점

    • 종속성(의존성)이 줄어든다.

      • 종속성이 줄어드므로, 변경에 민감하지가 않다.
    • 재사용성이 증가한다.

      • 다른 클래스에서도 이러한 의존 객체가 필요한 경우, Bean 컨테이너에서 의존 객체를 주입해줄 수 있다.
    • 테스트 코드를 작성하는것에 대한 불편함이 줄어든다.

    • 코드의 가독성이 올라간다.

Build

  • 소스코드 파일을 컴퓨터에서 실행시킬 수 있도록 가공하는 것, 실행가능한 파일로 만드는 것을 의미한다.

Redis

  • 오픈소스 기반의 비관계형 데이터베이스 관리 시스템을 의미한다. 주로 캐시 용도로 많이 사용하고 있다.

JDBC

  • Java에서 데이터베이스에 접근할 수 있는 Java 인터페이스를 의미한다.

REST API

  • 웹 설계의 우수성을 제대로 사용하기 위한 ArchitectureREST를 기반으로 설계된 API를 의미한다.

  • REST API에 대해서는 다룰 내용이 많으므로 추후 다른 포스팅으로 자세하게 다룰 예정이다.

프레임워크

  • 소프트웨어에서 특정 문제를 해결하기 위해 상호 협력하는 클래스와 인터페이스의 집합체를 의미한다.

  • 프로그램 설계를 위하여 일관된 방법이나 설계를 제공하는 환경을 의미하기도 한다.

  • 어떠한 목적을 달성하기 위해 복잡하게 얽혀있는 문제를 해결하기 위한 구조이며, 소프트웨어 개발에 있어 하나의 뼈대 역할을 한다.

  • 라이브러리와의 차이점

    • 프레임워크라고 하면, 클래스와 라이브러리가 합쳐진 형태라고 볼 수 있다.

    • 메소드 및 클래스화, 즉 모듈화를 하는 이유 중 하나가 재사용성인데, 프레임워크는 이 재사용성을 큰 그룹단위로 묶어주었다고 보면 된다.

    • 재사용 가능한 수많은 클래스들과 라이브러리들을 처음부터 융합한 채로 제공해 주기 떄문에, 여러 개의 표준을 만들지 않아도 되서 개발자의 피곤함을 덜어준다.

JPA(Java Persistent API)

  • 애플리케이션과 JDBC 사이에서 동작하는 도구를 의미한다.

  • 자바 플랫폼 SEEE를 사용하는 응용 프로그램에서 관계형 데이터베이스의 관리를 표현하는 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 또는 프로젝트 관리 도구의 종류 중 하나이다.

  • GradleAnt의 유용성과 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/123123번째 book이라는 고유한 의미를 가지고 있는 URI로 인식된다. 이에 대한 처리는 GET, POST와 같은 HTTP Method를 통해 처리된다.
  • REST API는 외부에서 위와 같은 방식으로 특정 URI를 통해서 사용자가 원하는 정보를 제공하는 방식이다.

    • REST 방식의 서비스 제공이 가능한 APIRestful하다고 표현한다.
  • Spring 3부터 @Repository라는 어노테이션을 지원하면서 REST 방식의 처리를 지원하고 있었으며, Spring 4에 들어와서 @RestController라는 어노테이션이 본격적으로 소개되었다.

  • @RestController

    • 특정한 JSP와 같은 뷰를 만들어내는 것이 아닌 REST 방식의 데이터 자체를 서비스하는 것을 말한다.

    • @Controller + @Repository의 축약형으로써, 리턴값을 View Resolver로 매핑하지 않고 그대로 출력해준다.

    • @RestController라는 어노테이션을 Controller에 지정하면, 해당 컨트롤러의 모든 메소드는 자동적으로 @Responsebody 어노테이션이 적용되어 동작한다.

    • @RestController가 적용된 컨트롤러의 모든 메소드는 JSP등의 뷰를 생성하지 않고, 데이터만 반환하게 된다.

    • 반환되는 데이터는 크게 문자열, JSON, XML 등으로 나뉜다.

    • @ControllerRestful 컨트롤러인 @RestController의 차이점은 HTTP Response Body가 생성되는 방식이다.

    • @ControllerView 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를 만들어준다.

  • 클래스 내에 @ToStringEqualsAndHashCode를 적용시켜 메서드를 오버라이딩 해주며 @RequiredArgsConstructor를 지정해 준다.

@Component

  • Spring@Repository, @Service@Controller가 관리하는 구성 요소에 대한 일반 스테레오 타입을 의미한다.

  • MVC의 구성 요소를 나타내는 일반 주석이다.

  • 주석 된 Bean을 스캔하여 D.I 컨테이너에서 사용할 수 있게 해주는 최상위 일반 주석이다.

Annotation

  • 인터페이스를 기반으로 한 어떠한 기능을 주입하는데에 사용되는 키워드를 의미한다.

H2

  • Java로 작성된 In Memory RDBMS를 의미한다.

마치며

이번 포스팅에서는 Spring을 처음 공부할 때 많이 낯설었던 키워드나 용어 위주로 간단하게 정리해보았다. 이번 포스팅에서 다루었던 키워드 중에 일부는 더 자세한 포스팅을 통해서 더 자세하게 다룰 예정이 있으나, 최대한 빠른 시일 내는 아닐 거다.. 시간 날 때 천천히 포스팅 할 생각이다. 이번 포스팅에서 다루었던 용어 또는 키워드 중에서 더 자세하게 알고 싶은 내용이 있다면 관련 키워드로 구글에서 자료를 찾아보면 더 깊은 내용을 다루고 있는 레퍼런스를 어렵지 않게 찾아볼 수 있을 것이다. 여기서는 일단 간단하게 정리하는 것이 주된 목적이었으니, 그렇게까지 깊게 다루진 않았다. (깊게 다루는 게 결코 귀찮지는 않았다..) 이번 포스팅은 여기서 마무리하고 다음에 관련 내용 또는 다른 내용으로 새로운 포스팅을 작성해보겠다.