관리 메뉴

KorSA

스프링 기본 본문

Study Memos/Spring Framework

스프링 기본

Praiv. 2021. 3. 22. 02:01
320x100

1. 웹 개발 방법은 1) 정적 컨텐츠, 2) MVC와 템플릿 엔진, 3) API 방식이 있다.
    1) 정적 컨텐츠 
        => resources/static/에 있는 HTML등의 파일을 그대로 클라이언트에게 던져준다.
        => 동적으로 파일 내용을 변경할 수는 없다.

    2) MVC와 템플릿 엔진
        => 서버에서 파일을 필요에 따라 변경한 후 클라이언트에게 던져준다.
        => MVC는 Model, View, Controller 로 구성되어 있다.
             View는 화면을 그리는데 집중한다.
             Controller, Model은 Business Logic 관리에 집중한다.
        => 클라이언트 요청은 Controller에게로 전달되고, Controller가 보낸 요청은 ViewResolver에 의해 특정 View로 전달된다.
        => 클라이언트 요청은 첫번째로 Controller를 탐색하지만, 적절히 대응해주는 Controller를 못 찾은 경우 static/ 폴더에서 대응되는 파일을 찾는다.

3) API 
    => 클라이언트에게 특정 데이터를 JSON으로 던져준다.
    => @ResponseBody 어노테이션을 사용하면 HTTP Request의 Response 메시지를 프로그래머가 설정한다.
    => MVC처럼 View라는 템플릿이 Response를 보내는 게 아니라 Controller가 바로 응답한다.
    => MVC에서 ViewResolver를 사용한다면, API 방식은 HttpMessageConverter가 사용된다.

2. 테스트는 매우매우 중요하다.
    => 테스트는 개발 전 과정에서 일일이 빌드하고 웹 브라우저에서 결과값을 확인하는 과정을 없애준다.
    => 코드가 몇 만 라인, 몇 십만 라인 넘어가는데도 테스트 코드가 없다면 망삘이 물씬 풍긴다. 이건 실제 우리 회사 상황..
    => 순수한 단위 테스트가 좋은 테스트일 확률이 높다. 테스트 한번에 Spring Container가 로드되면서 테스트가 무거워지면 좋지 않은 테스트일 확률이 높다.

    필요하다면 Spring Container를 올려야겠지만 되도록 잘개 쪼개진 테스트로 작성하는 게 좋다.

3. Spring의 Service는 Business Logic과 밀접하기 때문에 네이밍도 기획자의 용어와 매칭이 되게 작성하는 게 좋다.

4. 컴포넌트 스캔
    => @Component 어노테이션을 쓰면 자동으로 스프링 빈으로 등록된다.
    => @Component가 내부적으로 존재하는 @Controller, @Service, @Repository 어노테이션들도 등록하면 Spring Container에 자동으로 등록이 된다.
    => 기본적으로 @SpringBootApplication 패키지의 하위부터 컴포넌트 스캔이 동작한다.
    => @Autowired 어노테이션으로 필드 주입을 할 수 있다. (DI)

5. 컴포넌트 스캔 말고 Spring Container에 직접 빈을 등록하는 방법도 있는데, 프로그래머가 해당 빈을 세밀하게 컨트롤할 필요가 있을 때 이 방식을 사용한다.
    => ex) DB가 아직 결정되지 않은 상태에서 프로그램을 만든 후 나중에 DB만 바꿔치기 해야 하는 경우, 직접 스프링 빈을 만들면 다형성을 활용할 수 있기 떄문에 기존 코드를 거의 건드리지 않는다.

6. 스프링 데이터 JPA
    => JPA도 좀 오래된 기술이라 스프링이 좀 더 편리하게 JPA를 쓸 수 있도록 지원해주는 기술이다.
    => 실무에서는 SQL 같은 DDL을 따로 파일로 빼서 관리하기도 한다.
    => 스프링 부트와 스프링 데이터 JPA만 사용해도 개발 생산성이 훨씬 증가한다.

7. 스프링 통합 테스트
    => @SpringBootTest 어노테이션을 사용하고, 테스트 수행 시 실제로 Spring이 로드된다.
    => @Transactional 어노테이션을 사용하면 테스트 시작 전에 트랜잭션을 실행하고 테스트가 끝나면 항상 롤백을 수행한다.
    이렇게 하면 장점이 DB에 데이터가 남지 않으므로 다음 테스트에 영향을 주지 않는다.

8. AOP - Aspect Oriented Programming (관점 지향 프로그래밍)
    => 모든 메소드의 호출 시간을 측정하는 등의 작업 요청을 손쉽게 하도록 도와주는 기술이다.
    => 공통 관심 사항(cross-cutting concern)과 핵심 관심 사항(core concern)을 분리하기 위해 사용한다.
    => @Aspect 어노테이션으로 AOP 클래스를 지정하고, @Around 어노테이션으로 AOP의 적용 범위를 지정할 수 있다.
    => 실무에서는 전체 AOP 기능의 5% 정도만 주로 사용한다.
    => Spring은 DI 개념을 사용하여 빈을 프록시로 로드하는데, 이 덕분에 AOP 기술이 구현 가능하다.

9. 스프링은 너무 큰 세계여서 모든 것을 세세하게 알 필요가 없다. 
   대신 문제가 발생했을 때 대략 어디쯤부터 찾아들어가면 될지, 필요한 부분을 찾아서 사용할 수 있는 능력이 더 중요하다.



추가>

1. 로깅 라이브러리 -> logback, slf4j 

2. Controller에서 리턴 값으로 문자를 반환하면 ViewResolver가 화면을 찾아서 처리한다.
resources:templates/ + {VieName} + .html

3. spring-boot-devtools 라이브러리를 추가하면, html 파일을 컴파일만 해줘도 서버 재시작 없이 View 파일 변경이 가능하다.

4. 서버 배포할 때는 jar 파일을 서버 장비에 옮겨놓고 그냥 java -jar {jar파일명} 만 하면 된다.
예전에는 톰캣 설치하고 WAR 설치하고 했지만 요즘엔 jar로 한 방에 배포되기 때문에 편리함.

5. Controller는 파라미터로 들어오는 정보를 @RequestParam(value="name") 으로 받는다.
요청> localhost:8080/hello?name=string
받기> public String hello(@RequestParam(name = "name") String name, Model model) { ... }

6. Spring 은 기본적으로 JSON 컨버팅할 때 Jackson 라이브러리를 사용함

728x90
728x90
Comments