즉, 두 단어를 결합해서 본다면 '어떤 객체가 필요한 객체를 외부에서 밀어 넣는다'는 의미.
그렇다면 왜?? 외부에서 객체를 주입하는 방식을 사용하는가?
음식점을 예로 들어보면 쉽게 이해할 수 있다.
1. 식재료를 직접 구매하여 음식점을 운영한다.
- 식재료 구매도 신경쓰고, 음식점 운영도 신경 써야 한다.
2. 외부에서 식재료를 공급해주고 그걸 이용해서 음식점을 운영한다.
- 식재료 수급이 편이하고, 장사에만 집중할 수 있다.
2번 처럼 외부에서 주입 받는경우 개발에만 집중할 수 있게 되는 것이다.
스프링은 이러한 구조를 만들기 적합한 구조로 설계되어 있다. 스프링에서는 'ApplicationContext'라는 존재가 필요한 객체들을 생성하고, 필요한 객체들을 주입하는 역할을 해주는 구조이다. 따라서 개발자들은 기존의 프로그래밍과 달리 객체와 객체를 분리해서 생성하고, 이러한 객체들을 엮는 작업을 하는 형태의 개발을 한다. ApplicationContext가 관리하는 객체들을 빈(Bean) 이라고 부르고, 빈과 빈 사이의 의존관계를 처리하는 방식으로 XML 설정, 오노테이션 설정, Java 설정 방식을 이용할 수 있음.
- 간단히POJO는 말 그대로 해석을 하면 오래된 방식의 간단한자바오브젝트라는 말로서Java EE등의 중량프레임워크들을 사용하게 되면서 해당 프레임워크에 종속된 "무거운" 객체를 만들게 된 것에 반발해서 사용되게 된 용어이다. 2000년 9월에마틴 파울러, 레베카 파슨, 조쉬 맥킨지 등이 사용하기 시작한 용어로서 마틴 파울러는 다음과 같이 그 기원을 밝히고 있다.[1]
“
우리는 사람들이 자기네 시스템에 보통의 객체를 사용하는 것을 왜 그렇게 반대하는지 궁금하였는데, 간단한 객체는 폼 나는 명칭이 없기 때문에 그랬던 것이라고 결론지었다. 그래서 적당한 이름을 하나 만들어 붙였더니, 아 글쎄, 다들 좋아하더라고.
”
— 마틴 파울러
POJO라는 용어는 이후에 주로 특정자바모델이나 기능,프레임워크등을 따르지 않은 자바 오브젝트를 지칭하는 말로 사용되었다.스프링 프레임워크는 POJO 방식의 프레임워크이다.
스프링은 내부에서 객체 간의 관계를 구성.
이 관계를 구성할 때 별도의 API 등을 사용하지 않는 POJO의 구성만으로 가능하도록 제작.
-> 일반적인 Java 코드를 이용해서 객체를 구성하는 방식을 그대로 스프링에서 사용할 수 있다는 이야기
의미?
- 코드를 개발할 때 개발자가 특정한 라이브러리나 컨테이너 기술에 종속적이지 않다.
- 개발자는 가장 일번적인 형태로 코드를 작서앟고 실행할 수 있기 때문에 생산성에서도 유리
우리는 타 시스템 간에 데이터를 주고 받을 때, 데이터 포맷에 대한 약속이 필요하다. 시스템을 개발하거나 내부시스템끼리는 규칙을 만들어 지킬 수 있다. 하지만 문제는 타 시스템과 연동 할 때 발생한다.
내부에서 세운 규칙을 타 시스템과 데이터를 주고 받을 때마다 데이터 규칙에 대한 문서를 주고 받는다면 문서들도 많아지고 비효율적이게 된다. 그래서 XML, Json과 같은 데이터 포맷을 정의하여 사용하고 있고 그 포맷에는 규칙도 있다.
가장 오래 사용된 포맷은 XML이다.
xml 포맷 형식
XML은 태그형식을 통해 Key-Value를 구분하고, 태그안에 태그를 넣어서 부모와 자식관계의 구조를 나타낸다.
Object와 Array 부분은 표시를 해놨지만 Xml포맷상으로는 구분이 안되는 부분도 있다.
다음은 똑같은 내용의 JSON 포맷이다.
JSON 포맷 형식
XML포맷과 비교해 보았을 때, 훨씬 간소화된 느낌을 받을 수 있다.
Object 일 경우, {}로 감싸주고
Array일 경우, []로 감싸주는 형식이다.
Key값의 경우 XML 은 앞 뒤로 두번씩 들어가는데 JSON에서는 한번씩 들어가서 더 간결하다.
그런데도 {}, [], "" 같은 문자들이 불필요하게 많이 들어간 느낌이 있다.
다음은 YAML이다. 야믈(?)이라고 읽고, yml이라고 쓴다.
yml 포맷 형식
-(하이픈)을 통해서 Array임을 알 수 있다.
YAML이 딱 봐도 다른 포맷들보다 깔끔하다고 느낄 수 있다.
마지막으로 3가지 가독성 비교.
3가지 포맷 비교
따로 볼 땐 잘 몰랐는데 확실히 YAML이 깔끔해 보인다. YAML 포맷은 현재 많은 곳에서 사용되고 있다. 많은 사람들이 개발 시스템 설정 파일을 예전에는 config.properties를 사용했는데 현재는 config.yml로 많이 쓰는 추세이다. 참고로 쿠바네티스에서도 API를 전송할 땐 JSON 규격도 사용하지만 일반적으로는 YAML을 권장한다.
스프링 프레임워크(Spring Framework)는 자바 플랫폼을 위한 오픈소스 애플리케이션 프레임워크로서 간단히 스프링(Spring)이라고도 불린다. 동적인 웹 사이트를 개발하기 위한 여러 가지 서비스를 제공하고 있다. 대한민국 공공기관의 웹 서비스 개발 시 사용을 권장하고 있는 전자정부 표준프레임워크의 기반 기술로서 쓰이고 있다.
장점
경량 컨테이너
IoC(Invertion of Control : 제어 역행)
DI(Dependency Injection : 의존성 주입)
AOP(Aspect-Oriented Programming : 관점지향 프로그래밍)
SPRING BOOT
스프링 프레임워크는 기능이 많은만큼 환경설정이 복잡하다. 이에 어려움을 느끼는 사용자들을 위해 나온 것이 바로 스프링 부트다. 스프링 부트는 스프링 프레임워크를 사용하기 위한 설정의 많은 부분을 자동화하여 사용자가 정말 편하게 스프링을 활용할 수 있도록 돕는다. 스프링 부트 starter 디펜던시만 추가해주면 바로 API를 정의하고, 내장된 탐캣이나 제티로 웹 어플리케이션 서버를 실행할 수 있다. 심지어 스프링 홈페이지의 이니셜라이저를 사용하면 바로 실행 가능한 코드를 만들어준다. 실행환경이나 의존성 관리 등의 인프라 관련 등은 신경 쓸 필요 없이 바로 코딩을 시작하면 된다. 그리고 바로 그것이 스프링의 키 포인트이다.
Spring Boot가 Spring Framework와 다른점.
Embed Tomcat을 사용하기 때문에, (Spring Boot 내부에 Tomcat이 포함되어 있다.) 따로 Tomcat을 설치하거나 매번 버전 관리를 해주어야 하는 수고를 덜 수 있다.
starter을 통한 dependency 자동화:
Spring framework 에서는 각각의 dependency들의 호환되는 버전을 일일이 맞추어 주어야 했고, 때문에 하나의 버전을 올리고자 하면 다른 dependency에 까지 영향을 미쳐 version 관리에 어려움이 많았다. 하지만, 이제는 starter가 대부분의 dependency를 관리해주기 때문에 이러한 걱정을 많이 덜게 되었다.
XML설정을 하지 않아도 된다.
jar file을 이용해 자바 옵션만으로 손쉽게 배포가 가능하다.
Spring Actuaor를 이용한 애플리케이션의 모니터링과 관리를 제공한다.
Spring Boot Starter란?
starter란 특정 목적을 달성하기 위한 의존성 그룹이라고 생각하면 이해가 쉽다. starter는 마치 npm처럼 간편하게 dependency를 제공해주는데, 만약 우리가 JPA가 필요하다면 prom.xml(메이븐)이나 build.gradle(그레이들)에 'spring-boot-starter-data-jpa'만 추가해주면 spring boot가 그에 필요한 라이브러리들을 알아서 받아온다.
spring-boot-starter-*
starter의 명명 규칙은 위와 같다. JPA 예시에서 알 수 있듯이 *부분에 원하는 스사터명을 명시하면 된다. 명명 규칙을 알면 손쉽게 원하는 라이브러리를 import 할 수 있다.
우리가 사용하는 톰켓이 템플릿엔진(.mustache, .jsp)에 포함된 java코드를 해석해서 HTMl 페이지로 응답한다.
1. .txt파일 응답하기.
HttpRespController.java를 생성하여 아래 코드를 작성한다.
이 때 @Contorller를 써야하는데 그 이유는 파일을 리턴할 것이기 때문이다.
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
@Controller // 파일을 리턴해줄 것이기 때문.
public class HttpRespController {
@GetMapping("/txt")
public String txt() {
return "a.txt";
}
}
src/main/resources/static에 a.txt를 만들어준다. 그리고 마음대로 글을 작성해준다.
위 경로에 작성하는 이유는 우리가 프레임워크를 사용중이기 때문이다. 프레임워크는 틀이 정해져 있다.
- 일반 정적 파일들은 resources/static 폴더 내부가 default 경로이다.
This is a.txt
그 후 서버를 실행해 크롬에서 페이지를 호출해본다. (Get방식이기 때문에 웹에서 확인 가능)