[spring] 웹 기초 이론

ppparkta·2023년 3월 30일
1

멋쟁이사자처럼

목록 보기
2/2

더 보기 좋은 링크

1. HTTP

💡 Hyper Text Transfer Protocol의 약자로 HTML파일을 가져오게 해주는 Protocol이다. 웹에서 이루어지는 모든 정보 교환의 기초이며 클라이언트-서버 프로토콜이라고도 한다.

1-1. HTTP 특징

비연결성(connectionless)무상태성(stateless)
클라이언트가 요청을 한 후 응답을 받으면 그 연결을 끊어 버리는 특징통신이 끝나면 상태를 유지하지 않는 특징

1-2. HTTP 메세지

HTTP메세지는 크게 요청/응답 메세지로 나눌 수 있다. 아래의 두가지 예시에 있는 시작줄, header를 포함해 body를 갖고 있다.

2. URL

💡 URL은 Uniform Resource Locator의 줄임말로 웹을 뒷바침하는 주소체계이다. URL의 각 구간마다 명칭과 의미하는 바가 다르다. 크게 프로토콜, 호스트, 경로, 매개변수를 설명한다.

2-1. Protocol

protocol은 컴퓨터나 원거리 통신 장비 사이에서 메세지를 주고 받는 양식과 규칙 체계이다. 앞서 소개한 HTTP도 protocol이고, 이전에 사용했던 SMTP, FTP도 protocol이다.

웹에서 서버와 클라이언트 사이에서 어떤 방식으로 정보를 주고받을지 알려준다.

2-2. Host

Host는 서버의 주소이다. 도메인 or IP주소(ex. 127.0.0.1)를 사용한다. 도메인 뒤에 포트넘버가 올 수도 있는데 표준 포트를 사용한다면 포트넘버는 대부분 생략한다.

2-3. Path

웹서버 자원에 대한 경로를 의미한다. Host를 통해 서버에 접근하고 세부적인 서비스는 경로를 통해 구분한다. 여기서부터는 실제 경로가 아니라 추상적인 의미의 경로이다.

루트 경로: ex) https://www.example.com/

루트의 soobin.txt를 지정: ex) https://www.example.com/soobin.txt

2-4. Query String

웹서버에 보내는 추가 매개변수이다. 키와 값이 쌍을 이루고 키와 값은 = 을 통해 구분한다. 매개변수가 여러개라면 & 을 사용해서 구분한다.

경로 뒤에 매개변수가 오면 ? 을 붙여서 연결한다.

3. 쿠키와 세션

HTTP의 특성이자 약점을 보완하기 위해서 쿠키와 세션을 사용한다. HTTP는 비연결성, 무상태성을 지니기 때문에 서버는 매번 클라이언트가 누구인지 확인해야 한다. 이 특성을 보완하기 위해 사용하는 것이 쿠키와 세션이다.

비연결성(connectionless)무상태성(stateless)
클라이언트가 요청을 한 후 응답을 받으면 그 연결을 끊어 버리는 특징통신이 끝나면 상태를 유지하지 않는 특징

이런 특성은 예를들어, 네이버에서 웹툰을 구매하려고 로그인 했음에도, 페이지를 이동할 때마다 새롭게 로그인 해야하는 상황을 야기한다.

쿠키 혹은 세션을 사용하면 한 번 로그인 했을 때 어떠한 방식에 의해 사용자에 대한 인증을 유지하게 된다.

3-1. 쿠키

💡 쿠키는 서버에서 클라이언트로 보내져서 저장되는 작은 크기의 데이터이다. 키와 값으로 구성돼있다.

3-1-a. 쿠키의 특징

  • 사용자 인증이 유효한 시간을 명시할 수 있음. (유효시간 정해지면 브라우저 종료돼도 인증이 유지됨)
  • 쿠키는 클라이언트 로컬에 저장했다가 참조함
  • 클라이언트는 최대 300개의 쿠키 저장 가능. 한 도메인 당 20개의 값만 가질 수 있음. (하나 당 4kb)
  • Response Header에 Set-Cookie 속성을 사용하면 클라이언트에 쿠키를 만들 수 있음
  • 쿠키는 사용자가 따로 요청하지 않아도 브라우저가 Request시에 Request Header를 넣어서 자동으로 서버에 전송함

3-1-b. 쿠키의 동작방식

  1. 클라이언트가 페이지 요청
  2. 서버에서 쿠키 생성
  3. HTTP 헤더에 쿠키 포함시켜 응답
  4. 쿠키 만료 기간 동안 클라이언트에서 보관(브라우저 종료돼도 유지)
  5. 같은 요청 시 HTTP 헤더에 쿠키 함께 보냄
  6. 서버에서 쿠키 읽어 이전 상태 정보 변경해야 할 때 쿠키 업데이트해서 변경된 쿠키 HTTP헤더에 함께 보냄

3-1-c. 쿠키의 구성요소

이름유효시간도메인경로
식별자-쿠키 유지시간쿠키 전송할 도메인쿠키 전송할 요청경로

3-2. 세션

💡 세션은 쿠키 기반이지만 정보 파일을 브라우저에 저장하는 쿠키와 달리 해당 파일을 서버에서 관리한다.

3-2-a. 세션의 특징

  • 서버는 클라이언트 구분을 위한 세션ID를 발급하고 브라우저가 서버에 접속해 브라우저를 종료할 때까지 인증상태 유지함
  • 접속 시간에 제한을 둬서 일정 시간 응답이 없을 때 정보가 유지되지 않게 설정 가능
  • 정보를 서버에서 관리하므로 보안 측면에서 좋지만, 서버 메모리를 많이 차지함(동접자 많을수록 서버 과부하)
  • 클라이언트가 Request보내면 서버의 엔진이 클라이언트에게 세션ID 부여함

3-2-b. 세션 동작방식

  1. 클라이언트가 서버에 접속 시 세션 ID를 발급 받음
  2. 클라이언트는 세션 ID에 대해 쿠키를 사용해서 저장하고 가지고 있음
  3. 클라리언트는 서버에 요청할 때, 이 쿠키의 세션 ID를 같이 서버에 전달해서 요청
  4. 서버는 세션 ID를 전달 받아서 별다른 작업없이 세션 ID로 세션에 있는 클라언트 정보를 가져와서 사용
  5. 클라이언트 정보를 가지고 서버 요청을 처리하여 클라이언트에게 응답

3-3. 쿠키와 세션 비교

쿠키세션
쇼핑몰 장바구니로그인 같이 보안상 중요한 작업을 수행할 때 사용
자동로그인-
팝업에서 "오늘 더 이상 이 창을 보지 않음" 체크-

4. 네트워크

💡 네트워크는 2대 이상의 컴퓨터가 연결된 체계이자 통신망이다.

4-1. Switch

여러 대의 컴퓨터가 하나의 네트워크 안에 구성되기 위한 매개체이다.

4-2. IP

컴퓨터 간에 데이터를 주고받는 네트워크 계층 규약이다. 8비트 씩 네개, 총 32비트의 2진수이며, 이를 10진수로 변환하면 IP주소가 된다.

한 자리에 최대 2^8인 256개(0을 포함하므로 255가 가장 큰 수임, 0번~255번) 의 수가 올 수 있다. 따라서 범위는 0.0.0.0~255.255.255.255

4-2-a. localhost

IP주소 중 특별하게도 127.0.0.1은 localhost, 즉 자기 자신을 의미한다.

4-3. Port

포트는 하나의 컴퓨터에서 여러 작업 혹은 서비스를 실행할 때, 서비스를 구분할 수 있게 해준다.

같은 port number를 동시에 사용할 수 없다. 백엔드 프로그래밍시 각각의 작업마다 port number를 다르게 설정해야 여러개의 서비스를 동시에 작업할 수 있다.

HTTP80
HTTPS443
FTP21
SSH22
SMTP25

4-4. DNS

DNS는 domain name service의 약자이다. URL을 해석해서 IP주소로 반환하는 서버를 의미한다.

5. 스프링부트

💡 스프링부트는 java를 기반으로 한 웹 어플리케이션 프레임워크다.

5-0. 정적컨텐츠

static폴더에 정적컨텐츠(동적인 요소가 없는 파일)을 올리면 내장 서버에서 컨트롤러를 먼저 거친 다음 컨트롤러에 찾는 내용이 없으면 static 폴더에서 내용을 찾는다. (컨트롤러가 static보다 우선순위를 가짐)

5-1. MVC패턴

💡 Model, View, Controller

5-1-a. 디자인 패턴

디자인 패턴은 객체 지향 프로그래밍 설계를 할 때 자주 발생하는 문제들을 피하기 위해 사용되는 패턴이다.

5-1-b. MVC

model데이터를 가진 객체. 화면 그릴 때 필요한 동적인 정보를 담아서 화면에 넘겨주는 역할을 함
view화면을 그리는데 집중함. 컨테이너.
controller서버 관련된건 다 컨트롤러에서 처리함. 사용자가 접근한 url에 따라 사용자 요청사항을 파악한 후에 요청에 대한 데이터를 모델에 의뢰함. 데이터를 뷰에 반영함.

5-2. 템플릿 엔진

템플릿 엔진은 템플릿 양식과 특정 데이터 모델에 따른 입력 자료를 결합하여 원하는 결과 문서를 출력하는 소프트웨어/컴포넌트이다.

5-3. API

API는 Application Programming Interface의 약자로, 클라이언트와 서버, 프로그램과 프로그램 간 상호 통신 매개체이다.

5-4. REST API

REST기반 API. 자원 이름으로 구분하여 상태를 주고받는 API이다.

  • HTTPS uri 통해 자원 명시
  • HTTP method(GET, POST, …)를 통해 해당 자원에 대한 CRUD Operation 적용
HTTP URIHTTP MethodHTTP Message PayLoad
자원자원에 대한 행위자원에 대한 행위의 내용

5-4-a. REST API의 특징

  • server-client구조
  • 무상태성
  • 캐시 처리 가능
  • 계층화
  • 인터페이스 일관성

5-4-b. REST API의 규칙

  1. URI는 명사, 소문자 사용해야 함
  2. url 마지막에는 슬래시 미포함
  3. 언더바(_) 대신 하이픈(-) 사용
  4. 파일확장자는 URI에 포함하지 않음

6. 스프링 빈

💡 Spring Bean이란 스프링 IoC 컨테이너가 관리하는 자바 객체를 의미한다.

스프링에서 POJO(Plain Old Java Object)를 beans라고 부른다. Spring Framework에서는 ApplicationContext.getBean()과 같은 메서드를 이용하여 직접 호출할 수 있다.

6-1. IoC(Inversion Of Control)

java에서 객체를 사용할 때는 new 연산자, 인터페이스 호출, 팩토리 호출 방식으로 객체를 생성하고 소멸하지만, 스프링 컨테이너를 사용하면 IoC가 해당 역할을 대신해 준다.

즉, 제어 흐름을 외부에서 관리하게 된다. 또한, 객체들 간의 의존 관계를 스프링 컨테이너가 런타임 과정에서 알아서 만들어 준다. 특정 *어노테이션을 붙이면 객체를 스프링 컨테이너로 인식한다.

6-2. 어노테이션

💡 어노테이션은 주석이라는 의미를 갖고 있다. JDK 1.5 버전 이상부터 사용 가능하다.

어노테이션의 용도

  • 컴파일러에게 코드 작성 문법 에러를 체크하도록 정보를 제공
  • 소프트웨어 개발툴이 빌드나 배치시 코드를 자동으로 생성할 수 있도록 정보 제공 (spring 포함!)
  • 실행시(런타임시)특정 기능을 실행하도록 정보를 제공

6-3. 컴포넌트 스캔으로 Spring Bean 등록

어노테이션을 작성해서 컴포넌트 스캔 방식으로 자동 의존관계를 설정하는 방법이다.

💡 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 {}

6-4. 자바 파일로 직접 Spring Bean 등록

앞서 컴포넌트 스캔을 통해 자동으로 스프링 빈을 등록하는 방식과 달리, 직접 설정파일에 스프링 빈을 등록하는 방식도 존재한다.

우선, 앞서 실습에서 @Service @Repository 어노테이션을 지운다. (컨트롤러는 앞선 방식 그대로 사용함)

SpringConfig.java 파일을 생성해서 상단에 @Configuration 어노테이션을 등록하고 다음과 같이 스프링 빈을 @Bean 어노테이션으로 직접 등록한다.

[무료] 스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술 - 인프런 | 강의

4장 스프링 빈과 의존관계 참고

7. Lombok

💡 Lombok라이브러리에서 제공하는 어노테이션을 사용하면 기존의 코드를 보다 쉽게 작성할 수 있다.

7-1. getter/setter

**@Getter @Setter**
private String name;

7-2. ToString

**@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])

7-3. NoArgsConstructor, AllArgsConstructor

**@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;
}
profile
겉촉속촉

0개의 댓글