💡 Hyper Text Transfer Protocol의 약자로 HTML파일을 가져오게 해주는 Protocol이다. 웹에서 이루어지는 모든 정보 교환의 기초이며 클라이언트-서버 프로토콜이라고도 한다.
비연결성(connectionless) | 무상태성(stateless) |
---|---|
클라이언트가 요청을 한 후 응답을 받으면 그 연결을 끊어 버리는 특징 | 통신이 끝나면 상태를 유지하지 않는 특징 |
HTTP메세지는 크게 요청/응답 메세지로 나눌 수 있다. 아래의 두가지 예시에 있는 시작줄, header를 포함해 body를 갖고 있다.
💡 URL은 Uniform Resource Locator의 줄임말로 웹을 뒷바침하는 주소체계이다. URL의 각 구간마다 명칭과 의미하는 바가 다르다. 크게 프로토콜, 호스트, 경로, 매개변수를 설명한다.
protocol은 컴퓨터나 원거리 통신 장비 사이에서 메세지를 주고 받는 양식과 규칙 체계이다. 앞서 소개한 HTTP도 protocol이고, 이전에 사용했던 SMTP, FTP도 protocol이다.
웹에서 서버와 클라이언트 사이에서 어떤 방식으로 정보를 주고받을지 알려준다.
Host는 서버의 주소이다. 도메인 or IP주소(ex. 127.0.0.1)를 사용한다. 도메인 뒤에 포트넘버가 올 수도 있는데 표준 포트를 사용한다면 포트넘버는 대부분 생략한다.
웹서버 자원에 대한 경로를 의미한다. Host를 통해 서버에 접근하고 세부적인 서비스는 경로를 통해 구분한다. 여기서부터는 실제 경로가 아니라 추상적인 의미의 경로이다.
루트 경로: ex) https://www.example.com/
루트의 soobin.txt를 지정: ex) https://www.example.com/soobin.txt
웹서버에 보내는 추가 매개변수이다. 키와 값이 쌍을 이루고 키와 값은 =
을 통해 구분한다. 매개변수가 여러개라면 &
을 사용해서 구분한다.
경로 뒤에 매개변수가 오면 ?
을 붙여서 연결한다.
HTTP의 특성이자 약점을 보완하기 위해서 쿠키와 세션을 사용한다. HTTP는 비연결성, 무상태성을 지니기 때문에 서버는 매번 클라이언트가 누구인지 확인해야 한다. 이 특성을 보완하기 위해 사용하는 것이 쿠키와 세션이다.
비연결성(connectionless) | 무상태성(stateless) |
---|---|
클라이언트가 요청을 한 후 응답을 받으면 그 연결을 끊어 버리는 특징 | 통신이 끝나면 상태를 유지하지 않는 특징 |
이런 특성은 예를들어, 네이버에서 웹툰을 구매하려고 로그인 했음에도, 페이지를 이동할 때마다 새롭게 로그인 해야하는 상황을 야기한다.
쿠키 혹은 세션을 사용하면 한 번 로그인 했을 때 어떠한 방식에 의해 사용자에 대한 인증을 유지하게 된다.
💡 쿠키는 서버에서 클라이언트로 보내져서 저장되는 작은 크기의 데이터이다. 키와 값으로 구성돼있다.
이름 | 값 | 유효시간 | 도메인 | 경로 |
---|---|---|---|---|
식별자 | - | 쿠키 유지시간 | 쿠키 전송할 도메인 | 쿠키 전송할 요청경로 |
💡 세션은 쿠키 기반이지만 정보 파일을 브라우저에 저장하는 쿠키와 달리 해당 파일을 서버에서 관리한다.
쿠키 | 세션 |
---|---|
쇼핑몰 장바구니 | 로그인 같이 보안상 중요한 작업을 수행할 때 사용 |
자동로그인 | - |
팝업에서 "오늘 더 이상 이 창을 보지 않음" 체크 | - |
💡 네트워크는 2대 이상의 컴퓨터가 연결된 체계이자 통신망이다.
여러 대의 컴퓨터가 하나의 네트워크 안에 구성되기 위한 매개체이다.
컴퓨터 간에 데이터를 주고받는 네트워크 계층 규약이다. 8비트 씩 네개, 총 32비트의 2진수이며, 이를 10진수로 변환하면 IP주소가 된다.
한 자리에 최대 2^8인 256개(0을 포함하므로 255가 가장 큰 수임, 0번~255번) 의 수가 올 수 있다. 따라서 범위는 0.0.0.0~255.255.255.255
IP주소 중 특별하게도 127.0.0.1은 localhost, 즉 자기 자신을 의미한다.
포트는 하나의 컴퓨터에서 여러 작업 혹은 서비스를 실행할 때, 서비스를 구분할 수 있게 해준다.
같은 port number를 동시에 사용할 수 없다. 백엔드 프로그래밍시 각각의 작업마다 port number를 다르게 설정해야 여러개의 서비스를 동시에 작업할 수 있다.
HTTP | 80 |
---|---|
HTTPS | 443 |
FTP | 21 |
SSH | 22 |
SMTP | 25 |
DNS는 domain name service의 약자이다. URL을 해석해서 IP주소로 반환하는 서버를 의미한다.
💡 스프링부트는 java를 기반으로 한 웹 어플리케이션 프레임워크다.
static폴더에 정적컨텐츠(동적인 요소가 없는 파일)을 올리면 내장 서버에서 컨트롤러를 먼저 거친 다음 컨트롤러에 찾는 내용이 없으면 static 폴더에서 내용을 찾는다. (컨트롤러가 static보다 우선순위를 가짐)
💡 Model, View, Controller
디자인 패턴은 객체 지향 프로그래밍 설계를 할 때 자주 발생하는 문제들을 피하기 위해 사용되는 패턴이다.
model | 데이터를 가진 객체. 화면 그릴 때 필요한 동적인 정보를 담아서 화면에 넘겨주는 역할을 함 |
---|---|
view | 화면을 그리는데 집중함. 컨테이너. |
controller | 서버 관련된건 다 컨트롤러에서 처리함. 사용자가 접근한 url에 따라 사용자 요청사항을 파악한 후에 요청에 대한 데이터를 모델에 의뢰함. 데이터를 뷰에 반영함. |
템플릿 엔진은 템플릿 양식과 특정 데이터 모델에 따른 입력 자료를 결합하여 원하는 결과 문서를 출력하는 소프트웨어/컴포넌트이다.
API는 Application Programming Interface의 약자로, 클라이언트와 서버, 프로그램과 프로그램 간 상호 통신 매개체이다.
REST기반 API. 자원 이름으로 구분하여 상태를 주고받는 API이다.
HTTP URI | HTTP Method | HTTP Message PayLoad |
---|---|---|
자원 | 자원에 대한 행위 | 자원에 대한 행위의 내용 |
💡 Spring Bean이란 스프링 IoC 컨테이너가 관리하는 자바 객체를 의미한다.
스프링에서 POJO(Plain Old Java Object)를 beans라고 부른다. Spring Framework에서는 ApplicationContext.getBean()과 같은 메서드를 이용하여 직접 호출할 수 있다.
java에서 객체를 사용할 때는 new 연산자, 인터페이스 호출, 팩토리 호출 방식으로 객체를 생성하고 소멸하지만, 스프링 컨테이너를 사용하면 IoC가 해당 역할을 대신해 준다.
즉, 제어 흐름을 외부에서 관리하게 된다. 또한, 객체들 간의 의존 관계를 스프링 컨테이너가 런타임 과정에서 알아서 만들어 준다. 특정 *어노테이션을 붙이면 객체를 스프링 컨테이너로 인식한다.
💡 어노테이션은 주석이라는 의미를 갖고 있다. JDK 1.5 버전 이상부터 사용 가능하다.
어노테이션을 작성해서 컴포넌트 스캔 방식으로 자동 의존관계를 설정하는 방법이다.
💡 ex) 회원 컨트롤러가 회원서비스와 회원 리포지토리를 사용할 수 있게 의존관계를 설정함
[memberController] → [memberService] → [memberRepository]
@Component
어노테이션이 있으면 스프링 빈으로 자동 등록됨. 따라서 컴포넌트를 포함하는 아래의 어노테이션도 스프링 빈으로 자동 등록된다.
@Controller
@Service
@Repository
다만, 자바 객체는 스프링이 인식하지 못하기 때문에 생성자에 @Autowired
를 사용해서 스프링이 연관된 객체를 스프링 컨테이너에서 인식할 수 있게 한다. (의존성 주입)
스프링은 스프링 컨테이너에 스프링 빈을 등록할 때 기본적으로 싱글톤으로 등록한다. (new로 객체 인스턴스를 생성하는게 아니라, 이미 만들어진 하나의 인스턴스를 공유함)
**@Controller**
public class MemberController {
private final MemberService memberService;
**@Autowired**
public MemberController(MemberService memberService)
this.memberService = memberService;
}
}
**@Service**
public class MemberService {
private final MemberRepository memberRepository;
**@Autowired**
public MemberService(MemberRepository memberRepository) {
this.memberRepository = memberRepository;
}
}
**@Repository**
public class MemoryMemberRepository implements MemberRepository {}
앞서 컴포넌트 스캔을 통해 자동으로 스프링 빈을 등록하는 방식과 달리, 직접 설정파일에 스프링 빈을 등록하는 방식도 존재한다.
우선, 앞서 실습에서 @Service
@Repository
어노테이션을 지운다. (컨트롤러는 앞선 방식 그대로 사용함)
SpringConfig.java
파일을 생성해서 상단에 @Configuration
어노테이션을 등록하고 다음과 같이 스프링 빈을 @Bean
어노테이션으로 직접 등록한다.
[무료] 스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술 - 인프런 | 강의
4장 스프링 빈과 의존관계 참고
💡 Lombok라이브러리에서 제공하는 어노테이션을 사용하면 기존의 코드를 보다 쉽게 작성할 수 있다.
**@Getter @Setter**
private String name;
**@ToString(exclude = "password")**
public class User {
private Long id;
private String username;
private String password;
private int[] scores;
}
User user = new User();
user.setId(1L);
user.setUsername("dale");
user.setUsername("1234");
user.setScores(new int[]{80, 70, 100});
System.out.println(user);
//User(id=1, username=1234, scores=[80, 70, 100])
**@NoArgConstructor**
public class LombokTest {
private String test1;
public LombokTest (String test1) {
this.test1 = test1;
}
}
**@AllArgsConstructor**
public class LombokTest {
private String test1;
private String test2;
@NonNull
private String test3;
}