본문 바로가기
카테고리 없음

230213 TIL

by hbIncoding 2023. 2. 14.

Spring  심화 주차 3일차

1. Inflearn 스프링 웹 개발 기초

  1) 정적 컨텐츠

  • resources/static 안에 있는 파일을 불러올 수 있음.
  • controller에서 먼저 찾아보고 resources를 찾아본다.
  • 대표적으로 이메일에 많이 사용하며, 인터넷 데이터 전송, 데이터 베이스 저장, 파일에 값 저장 등 사용

  2) MVC : Model, View, Controller

 

  • resources/static 안에 있는 파일을 불러올 수 있음.
  • controller에서 먼저 찾아보고 resources를 찾아본다.
  • 대표적으로 이메일에 많이 사용하며, 인터넷 데이터 전송, 데이터 베이스 저장, 파일에 값 저장 등 사용

3) API

 ㄱ. @ResponseBody 문자 반환

  • @ResponseBody 를 사용하면 뷰 리졸버( viewResolver )를 사용하지 않음
  • 대신에 HTTP의 BODY에 문자 내용을 직접 반환

 ㄴ. @ResponseBody 객체 반환

  • @ResponseBody 를 사용하고, 객체를 반환하면 객체가 JSON으로 변환됨, 설정을 바꾸면 XML도 가능한데 보통 json
  • 아래와 같이 사용하고 http://localhost:8080/hello-api?name=spring! 작성 시 아래와 같이 반환
    • {
      •  
      • name: "spring!"
      }
    @GetMapping("hello-api")
    @ResponseBody
    public Hello helloApi(@RequestParam("name") String name){
        Hello hello = new Hello();
        hello.setName(name);
        return hello;

    }

    static class Hello{
        private String name;

        public String getName(){
            return name;
        }

        public void setName(String name) {
            this.name = name;
        }
    }

ㄷ. @ResponseBody 사용 원리

  • HTTP의 BODY에 문자 내용을 직접 반환
  • viewResolver 대신에 HttpMessageConverter 가 동작
  • 기본 문자처리: StringHttpMessageConverter
  • 기본 객체처리: MappingJackson2HttpMessageConverter
  • byte 처리 등등 기타 여러 HttpMessageConverter가 기본으로 등록되어 있음

4) 회원 관리 예제

  • 데이터: 회원ID, 이름
  • 기능: 회원 등록, 조회
  • 아직 데이터 저장소가 선정되지 않음(가상의 시나리오)
  • 컨트롤러: 웹 MVC의 컨트롤러 역할
  • 서비스: 핵심 비즈니스 로직 구현
  • 리포지토리: 데이터베이스에 접근, 도메인 객체를 DB에 저장하고 관리
  • 도메인: 비즈니스 도메인 객체, 예) 회원, 주문, 쿠폰 등등 주로 데이터베이스에 저장하고 관리됨

 

5) 테스트 케이스 작성

  • 개발한 기능을 실행해서 테스트 할 때 자바의 main 메서드를 통해서 실행하거나, 웹 애플리케이션의
    컨트롤러를 통해서 해당 기능을 실행한다. 
  • 이러한 방법은 준비하고 실행하는데 오래 걸리고, 반복 실행하기 어렵고 여러 테스트를 한번에 실행하기 어렵다는 단점이 있다. 
  • 자바는 JUnit이라는 프레임워크로 테스트를 실행해서 이러한 문제를 해결한다.
  • 아래와 같이 작성하여 각 테스트 마다 데이터를 초기화해서 꼬임을 방지할 수 있다.
    • @AfterEach를 이용해 각 test가 끝날 때 마다 실행하여 준다.
class MemoryMemberRepositoryTest {

    MemoryMemberRepository repository = new MemoryMemberRepository();

    @AfterEach
    public void afterEach(){
        repository.clearStore();
    }
}
    
    
public class MemoryMemberRepository implements MemberRepository{

    private static Map<Long, Member> store = new HashMap<>();
    private static long sequence = 0L;

    public void clearStore(){
        store.clear();
    }
}
  • main에서 Service를 만들고 해당 클래스에서 crtl +shift+t 를 누르면 test패키지에 test를 따서 만들수 있다.

6) 스프링 빈과 의존 관계

  • 생성자에 @Autowired 가 있으면 스프링이 연관된 객체를 스프링 컨테이너에서 찾아서 넣어준다. 이렇게
    객체 의존관계를 외부에서 넣어주는 것을 DI (Dependency Injection), 의존성 주입이라 한다.
  • @Controller가 있는 경우 스프링 빈으로 자동 등록된다.
  • 스프링 빈을 등록하는 2가지 방법
    • 컴포터는트 스캔과 자동 의존관계 설정
    • 자바 코드로 직접 스프링 빈 등록하기

ㄱ. 컴포넌트 스캔 원리

  • @Component 가 있으면 스프링 빈으로 자동 등록
  • @Controller,@Service,@Repository 가 @Component를 포함하기 때문에

ㄱ. 자바 코드로 직접 스프링 빈 등록하기

  • @Bean 을 이용하여 직접 등록 해준다.
import hello.hellospring.repository.MemberRepository;
import hello.hellospring.repository.MemoryMemberRepository;
import hello.hellospring.service.MemberService;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class SpringConfig {

    @Bean
    public MemberService memberService() {
   		return new MemberService(memberRepository());
    }
    @Bean
    public MemberRepository memberRepository() {
    	return new MemoryMemberRepository();
    }
}
  • 참고
    • XML로 설정하는 방식도 있지만 최근에는 잘 사용 안함
    • DI에는 필드 주입, setter 주입, 생성자 주입 이렇게 3가지 방법이 있다. 의존관계가 실행중에
      동적으로 변하는 경우는 거의 없으므로 생성자 주입을 권장한다.
    • 실무에서는 주로 정형화된 컨트롤러, 서비스, 리포지토리 같은 코드는 컴포넌트 스캔을 사용한다.
      그리고 정형화 되지 않거나, 상황에 따라 구현 클래스를 변경해야 하면 설정을 통해 스프링 빈으로
      등록한다.
    • 주의: @Autowired 를 통한 DI는 helloController , memberService 등과 같이 스프링이 관리하는
      객체에서만 동작한다. 스프링 빈으로 등록하지 않고 내가 직접 생성한 객체에서는 동작하지 않는다.

7) Spring data access

  • 생성자에 @Autowired 가 있으면 스프링이 연관된 객체를 스프링 컨테이너에서 찾아서 넣어준다. 이렇게
    객체 의존관계를 외부에서 넣어주는 것을 DI (Dependency Injection), 의존성 주입이라 한다.
  • @Controller가 있는 경우 스프링 빈으로 자동 등록된다.
  • 스프링 빈을 등록하는 2가지 방법
    • 컴포터는트 스캔과 자동 의존관계 설정
    • 자바 코드로 직접 스프링 빈 등록하기

 

2. 오늘 사용하고 배운 내용

  1) 쿠키, 세션, 토큰, 캐시, CND

  • 쿠키 : 브라우저에 저장되는 작은 텍스트 조각, 제 3자가 조회를 가능하기에 민감한 정보에는 적합하지 않음
    • 자주 보는 웹툰 목록, 다크 모드 설정 여부 등 간단한 여부에 적합
  • 세션 : 로그인 후 유효기간 만료 전까지 사용자가 서버로부터 인증받았음을 증명해 주는 것
    • 영어와 숫자가 혼합된 형식의 세션아이디를 서버가 만듬 ex)2sd98dbawix4
    • 사용자가 서버로 받은 세션 아이디를 쿠키로 저장하고 앞으로의 모든 요청과 함께 전달
    • 안정적이고 효과적이지만, 메모리에 올려둔 데이터를 빠르게 확인할 수 있는 대신 공간이 한정적
    • 동시접속자가 많아지면 메모리 공간이 부족해지고 부하가 걸릴 수 있다.
  • 토큰 : 서버가 세션 아이디 발급증을 따로 보관하는 것이 아닌 토큰만 보고 자기가 발급 한 것을 확인하고 요청을 허가해 주는 방식이다.
    • 상태를 따로 기억해 둘 필요가 없다는 장점이 있다.
    • 그렇기에 유효기간이 끝나기 전까지 따로 통제할 수 없다는 장점이 있다.
    • 이를 최소화 하기 위해 유효기간을 짧게 설정한다.
  • 캐시 : 한번 전송받은 데이터는 저장해놨다가 다시 꺼내쓴다면 반복적인 서버 요청이 불필요하다.
    • 쿠키는 사용자의 수고를 덜어준다면
    • 캐시는 데이터의 전송량을 줄이고 서비스 이용 속도를 높여준다.
  • CDN : 서버에 대한 사용자가 많아질 때 결국 부하가 걸리는데 분산된 여러개의 서버를 이용해 웹 콘텐츠를 사용자와 가까운 서버에서 전송함으로써 전송 속도를 높이는 방식이다.
    • 대량의 데이터를 송수신하는 유튜브나 넷플릭스와 같은 서비스에 필수적이다.