HTML 문서를 교환하기 위해 만들어진 통신규약.
요청/응답(Request/Response) 구조로 되어있다.
클라이언트가 HTTP Request를 서버에 보내면 서버는 HTTP Response를 보내는 구조이다.
HTTP는 Stateless이다.
상태를 저장하지 않는다는 뜻.
승객: 서울에서 전주가는 KTX는 얼마인가요?
직원: 25,000원 입니다.승객: 2장 주세요.
직원: 50,000원입니다. 결제는 무엇으로 하시겠습니까? (KTX 노선과 주문 수량에 대한 상태를 유지)승객: 체크카드로 할게요.
직원: 결제가 완료되었습니다. (KTX노선과 주문수량, 결제수단에 대한 상태를 유지)
승객: 서울에서 전주가는 KTX는 얼마인가요?
직원: 25,000원 입니다.승객: 2장 주세요.
직원: 무엇을 2장 구매하시는 거죠?승객: 아까 말했잖아요. 서울에서 전주가는 KTX요!
직원: 몇 장인지, 결제 수단은 무엇인지 한 번에 이야기 해주세요.
HTTP Request 메시지는 크게 3부분으로 구성 된다.
• Start Line
HTTP Method (POST,GET,PUT …etc), Request target (목표 URL), HTTP Version
• Headers
• Request에 대한 추가 정보를 담고 있는 부분
• HOST, User-Agent, Accept, Connection, Content-Type, Content-Length
• Body
• Request의 실제 내용
HTTP Response 메시지도 마찬가지로 크게 3부분으로 구성되어 있다.
• Status Line
• HTTP Version, Status Code (200, 404), Status Text (“OK”, “NOT Found”)
• Headers
• Request에 대한 추가 정보를 담고 있는 부분
• HOST, Server Header, Accept, Connection, Content-Type, Content-Length
• Body
• Response의 실제 내용
스프링은 자바 언어를 이용해 *엔터프라이즈급 개발을 편리하게 만들어주는
“오픈소스 경량급 애플리케이션 프레임워크”로 불린다.
스프링은 기능이 많은 만큼 설정이 복잡하다. -> 스프링 부트의 등장
*엔터프라이즈급 개발이란?
스프링은 개발에 필요한 각 모듈의 의존성을 직접 설정해야했다. 호환되는 버전을 명시해야 정상 작동 했기에 스프링 프레임워크의 버전과 다른 라이브러리의 버전까지 고려해야 했다.
Springboot는 Spring-boot-starter라는 의존성을 제공한다.
Spring-boot-starter은 각 라이브러리의 기능 관련해서 자주 사용되고 호환되는 버전을 자동으로 제공한다.
스프링 부트는 스프링 프레임워크의 기능을 사용하기 위한 자동 설정을 지원한다. 자동 설정은 애플리케이션에 추가된 라이브러리를 실행하는데 필요한 환경 설정을 알아서 찾아주는 것이다.
쉽게 말해, 애플리케이션을 개발하는데 필요한 의존성을 추가하면 프레임워크가 자동으로 관리해준다.
위 사진에 있는 @SpringBootApplication의 내부 구현을 보면 다음과 같다.
각 어노테이션들을 자세히 살펴보자.
@SpringBootConfiguration
해당 어노테이션이 적용된 클래스가 하나 이상의 @Bean 메서드를 선언하며 런타임 시 요청에 따라 스프링 컨테이너에 의해 처리될 수 있음을 나타낸다.
즉, 사용자가 추가적으로 Bean이나 설정 클래스들을 등록할 수 있도록 해준다.
@EnableAutoConfiguration
말 그대로 Spring boot에서 AutoConfiguration을 가능하게 해주는 어노테이션.
여기서 Spring Boot AutoConfiguration이란 Spring Application에서 자동으로 jar dependencies(의존성:두 모듈 간의 관계)를 기반으로 의존성을 설정하는 것을 말한다.
쉽게 말해, 사전에 정의한 라이브러리들을 Bean으로 등록해주는 어노테이션. *사전에 정의된 라이브러리들은 spring.factories라는 파일에 정의 되어있다.
@ComponentScan
@Component, @Service, @Repository, @Controller 어노테이션이 적용된 클래스들을 스캔하여 자동으로 Bean으로 등록해 주는 역할을 수행한다.
스프링(Spring) 컨테이너가 관리하는 자바 객체를 빈(Bean)이라 한다.
우리가 알던 기존의 Java Programming 에서는 Class를 생성하고 new를 입력하여 원하는 객체를 직접 생성한 후에 사용했다. 하지만 Spring에서는 직접 new를 이용하여 생성한 객체가 아니라, Spring에 의하여 관리당하는 자바 객체를 사용한다.
이렇게 Spring에 의하여 생성되고 관리되는 자바 객체를 Bean이라고 한다.
스프링 컨테이너가 필요에 따라 개발자 대신 Bean들을 관리(제어)해주는 행위이다.
어떤 객체에 스프링 컨테이너가 또 다른 객체와 의존성을 맺어주는 행위이다.
의존성 주입을 적용하지 않은 경우
<Gun.java>
public class Gun{
...
...
}
<Soldier.java>
public class Soldier {
private Gun gun;
public Soldier() {
gun = new Gun();
}
}
의존성 주입을 적용한 경우
<Gun.java>
@Component //스프링 컨테이너에 Bean으로 등록.
public class Gun{
...
...
}
<Soldier.java>
public class Soldier {
@Autowired //스프링 컨테이너에 있는 Gun 타입의 Bean을 주입
private Gun gun;
}
ComponentScan으로 @Component 어노테이션이 있는 클래스들을 Bean으로 만들어 놓고, @Autowired할 때 자동으로 찾아서 넘겨주는 것이다.
스프링부트는 기본적으로 Tomcat이라는 WAS가 내장되어 있다.
@SpringBootApplication을 실행하면 자동으로 웹 서버가 실행된다.
이때, Tomcat의 기본 포트는 8080이다.
-> localhost:8080이 실행된다.
*localhost는 현재 사용 중인 컴퓨터 자체를 가리키는 특수한 네트워크 주소
롬복(Lombok)은 자바 개발자들이 반복적이고 지루한 코드 작성 작업을 줄이기 위한 프로젝트이다.
롬복은 어노테이션(annotation)을 사용하여 자주 사용되는 메서드들을 자동으로 생성하고, 일부 작업을 자동화하여 개발자들이 보다 쉽게 개발을 할 수 있도록 도와준다.
롬복은 @Getter, @Setter, @NoArgsConstructor, @AllArgsConstructor 등 다양한 어노테이션을 제공한다.
- 접근제어자가 private로 설정되면, 해당 클래스 일원 말고는 접근할 수 없게 된다. 따라서 외부에서 private인 클래스나 필드에 접근하려면 Getter/Setter라는 메소드를 통해 접근해야 한다.
- 원래는 getId(), setId(), getTitle(), setTitle() 등등.. 메소드를 일일이 다 만들어 줘야하지만, Lombok을 이용하면 @Getter/@Setter 어노테이션으로 간단하게 해결된다.
- @NoArgsConstructor는 매개변수가 없는 기본 생성자(default constructor)를 자동으로 생성해주는 어노테이션이다.
- 일반적으로 클래스에 명시적으로 생성자를 작성하지 않았을 때 사용된다.
- 이 어노테이션을 사용하면 기본 생성자를 별도로 작성하지 않아도 되므로 코드를 간결하게 유지할 수 있다.
- @AllArgsConstructor는 모든 필드를 매개변수로 받는 생성자를 자동으로 생성해주는 어노테이션이다.
- 클래스의 모든 필드에 대한 매개변수를 포함하는 생성자를 생성해준다.
- 이 어노테이션을 사용하면 필드마다 별도의 생성자 매개변수를 작성하지 않아도 되므로, 코드 작성시간을 절약할 수 있다.