전송방식

단순 전송

- 콘텐츠의 길이를 할 때 사용한다.

- Content-Length 

 

압축 전송

- 컨텐츠의 용량이 클 때 압축해서 전송한다.

- Content-Encoding

 

분할 전송

- 컨텐츠를 분할해서 전송한다.

- 종료시에 0 \r\n으로 표현한다.

- 분한 전송시엔 Content-Length이 포함되지 않는다.

- Transfer-Encoding

 

범위 전송

- 클라이언트가 요청한 범위를 전송한다.

- Request = Ranges: Bytes=1001~2000

- Response = Content-Range: bytes 1001~2000 / 2000 <-끝길이


일반정보

단순한 정보성 헤더이다.

 

From

- 유저 에이전트의 이메일 정보

Referer 

- 이전 웹 페이지의 주소 (구글에서 검색해서 다른 페이지로 접속 시 구글이 표현된다)

- 유입경로를 분석할때 사용한다.

User-Agent

- 유저 에이전트 애플리케이션 정보(즉 클라이언트 애플리케이션 정보)

- 특정 브라우저에서의 오류를 체크할 수 있다.

- Request에서 사용한다.

Server

- 요청을 처리하는 ORIGIN 서버의 소프트웨어 정보

- 중간에 거치는 프록시 서버가 아닌 진짜 처리하는 서버 정보를 제공한다.

- Response에서 사용한다.

Date

- 메시지가 발생한 날짜와 시간

- Response에서 사용한다.

 


특별한 정보

 

Host

- 요청한 호스트 정보(도메인)

- 필수

- 하나의 서버가 여러 도메인을 처리해야 할 때 사용한다.

- IP로만 통신하기에 필요하다.

- Host: aaa.com

 

Location

- 웹 브라우저가 3xx 응답 결과에 Location헤더가 있으면, Location 위치로 자동 이동

- 201 : Location 값은 요청에 의해 생성된 리소스 URI

 

Allow

- 허용 가능한 HTTP 메서드

- 405 (Method Now Allowed) 에서 응답에 포함해야 함

- Allow: GET, HEAD, PUT

 

Retry-After

- 유저 에이전트가 다음 요청을 하기까지 기다려야 하는 시간

- 날짜 단위, 초 단위로 표현 가능하다.

 


인증

 

Authorization

- 클라이언트 인증 정보를 서버에 전달한다.

- Basic xxxxxxxxx

 

WWW-Authenticate

- 리소스 접근 시 필요한 인증 방법 정의

- 401 Unauthorized 응답과 함께 사용

- WWW-Authenticate : Newauth realm=“apps”…

표현

리소스(데이터)를 어떤 표현으로 전달할지를 의미한다.

즉, 서버와 클라이언트가 주고받는 전송 형태를 말한다.

json으로, xml으로 표현한다.

Content-Type  표현 데이터의 형식
Content-Encoding 표현 데이터의 압축 방식
Content-Language  표현 데이터의 자연언어
Content-Length 표현 데이터의 길이

 

표현 헤더는 reqeust, response 둘 다 사용

 

Ex)

HTTP/1.1 200 OK

Content-Type : application/json

Content-Length : 16



{“data”:”hello”}

 

Content-Encoding

     - gzip등으로 압축했을 때 클라리언트에서 압축방식을 알아야 하기에 표현을 전달할 때 사용한다.

 

Content-Length

     - ko,en등 한국어, 영어 표현

 

Content-Language

     - byte단위로 표현의 길이를 나타낸다.

 


협상(콘텐츠 네고시에이션)

클라이언트가 선호하는 표현 요청

 

Accept 클라이언트가 선호하는 미디어 타입 전달
Accept-CharSet 클라이언트가 선호하는 문자 인코딩
Accept-Encoding 클라이언트가 선호하는 압축 인코딩
Accept-Language 클라이언트가 선호하는 자연 언어 

협상헤더는 reqeust에서만 사용한다.

 

예를 다중언어를 지원하는 서버에서 기본이 영어일 때 한국어를 요청할 때 사용한다.

 

 

협상과 우선순위1

Quality values

우선순위를 설정해서 서버에 요청한다

Accept-Language : ko-KR, ko;ko;q=0.9, en-US;9=0.8

1.ko-KR;q=1(q=1은 생략)

2.ko;q=0.9

3.en-US;q=0.8

 

식으로 숫자가 큰 순으로 우선순위를 정해 요청한다.

 

협상과 우선순위 2

Quality values(q)

구체적인 것이 우선한다.

Accept : text/*, text/plain, text/plain;format=flowed, */*

 

협상과 우선순위 3

구체적인 것을 기준으로 미디어 타입을 맞춘다.

 

스프링 빈이란?

스프링이 객체를 생성해 들고 있는다.

즉, 스프링 컨테이너가 생성될 때 컨트롤러(빈)가 같이 생성된다.

 

why?

객체를 계속 생성할 필요가 없고 미리 생성해 그것을 사용한다.

 

빈과 의존관계

 

컨트롤러(@Controller) -> 서비스

컨트롤러로 요청이 들어오면 서비스를 통해 비즈니스 작업을 해야 하기에 컨트롤러가 서비스에 의존한다.

 

의존관계 주입방법

컨트롤러, 서비스를 다 빈으로 등록해준다.

의존관계를 생성할 땐 @Autowired를 사용한다.

 

빈등 록 방식

1. 컴포넌트 스캔

2. 자바 코드로 스프링 빈 등록

 

빈 등록은 메인 메서드가 있는 패키지부터 시작한다.

즉, 하위 패키지에 있는 것만 등록된다.


자바 코드로 빈 등록하기

 

@Configuration

public class SpringConfig {



    @Bean

    public MemberService memberService() {

        return new MemberService(memberRepository());

    }



    @Bean

    public MemberRepository memberRepository(){

        return new MemoryMemberRepository();

    }

}

애노테이션으로 등록하기

@Aspect
@Component
public class TimeTraceAop {

    @Around("execution(* hello.hellospring..*(..))")
    public Object execute(ProceedingJoinPoint joinPoint) throws Throwable {
        long start =  System.currentTimeMillis();
        try {
            return joinPoint.proceed();
        } finally {
            long finish = System.currentTimeMillis();
            long timeMs = finish - start;
            System.out.println(joinPoint.toString()+" / timeMs : "+timeMs+"ms");
        }

    }
}

@Component,@Service,@Repository 대신 자바로 등록할 수 있다.

정형화된 코드(@Service,@Repository)는 컴포넌트 스캔을 사용한다.

 

또, 생성자로 빈을 생성하는 게 제일 안전하다.

    private final MemberRepository memberRepository;
	
    //생성자
    @Autowired
    public MemberService(MemberRepository memberRepository) {
        this.memberRepository = memberRepository;
    }

+ Recent posts