스프링 입문편 정리

김민경·2023년 1월 31일
0

Server - Spring

목록 보기
2/5

🎈프로젝트 환경설정

  • gradle로 선택하고 dependencies 설정
  • 스프링 부트 라이브러리 살펴보기
    (직접 dependencis 설정해서 configured된 라이브러리)
    spring-boot-starter-web
    ---- spring-boot-starter-tomcat : 톰캣(웹서버)
    ---- spring-webmvc : 스프링 웹 MVC
    spring-boot-starter-thymeleaf: 타임리프 템플릿 엔진(View)
    (공통 라이브러리)
    spring-boot-starter(공통): 스프링 부트 + 스프링 코어 + 로깅
    ---- spring-boot
    -------- spring-core
    ---- spring-boot-starter-logging
    -------- logback, slf4j (* 스프링에서는 System.out.print를 쓰지 않고 로그를 쓴다)

아파치 : 웹 서버(정적인 데이터 처리하는 서버)
톰캣
: 아파치 소프트웨어 재단의 웹 어플리케이션 서버(와스)(동적인 데이터 처리하는 서버)
웹 서버 + 서블릿 컨테이너(클라이언트 요청을 받아 요청을 처리하고 다시 클라이언트에게 응답해주는 역할)

아파치 vs 톰캣

🎈스프링 웹 개발 기초

Controller(@Controller annotation)
View

  • Controller가 없으면 resources/static 폴더의 html 파일을 찾는다
  • Controller가 있으면 resources/templates 폴더의 html 파일을 찾는다

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

정적 컨텐츠

MVC와 템플릿 엔진

(서버에서 동적으로 html 바꿔서 전달하는 방식)

MVC : Model, View, Controller --> 관심사의 분리!(유지보수를 편리하게 하기 위함)

Model : 데이터와 관련된 부분
View : 사용자에게 보여지는 부분
Controller : 이 둘을 중개하는 역할

(MVC 원칙 5가지)
1. Model은 Controller와 View에 의존하지 않아야 한다
2. View는 Model에만 의존하고, Controller에는 의존하면 안 된다
3. View가 Model로부터 데이터를 받을 때, 사용자마다 다르게 보여주어야 하는 데이터에 대해서만 받아야 한다
4. Controller는 Model과 View에 의존해도 된다
5. View가 Model로부터 데이터를 받을 때, 반드시 Controller에서 받아야 한다

MVC란 무엇일까?(유튜브)

API

@ResponseBody
... viewResolver를 사용하지 않는다 ( 대신 HttpMessageConverter가 동작)
... HTTP의 BODY에 문자 내용을 직접 반환한다(HTML BODY TAG를 말하는 것이 아님)
... 객체를 반환하면 객체가 JSON으로 변환된다

회원 관리 예제


  • 회원 객체 - getId(), setId(), getName(), setName()

  • 회원 리포지토리 인터페이스 - save, findById, findByName, findAll
    --> 회원 리포지토리 메모리 구현체
    (동시성 문제가 고려되어 있지 않음, 실무에서는 ConcurrentHashMap,
    고유 key 값을 설정하기 위해 AtomicLong 사용 고려)

  • 회원 리포지토리 테스트 케이스 작성
    개발한 기능을 실행해서 테스트 할 때 자바의 main 메서드를 통해서 실행하거나,
    웹 애플리케이션의 컨트롤러를 통해서 해당 기능을 실행

    (problem)
    준비하고 실행하는데 오래 걸린다 / 반복 실행하기 어렵다 / 여러 테스트를 한번에 실행하기 어렵다

    (solution)
    JUnit이라는 프레임워크로 테스트를 실행해서 이러한 문제 해결
    (@BeforeEach, @AfterEach, @Test)

    • @BeforeEach : 각 테스트 실행 전에 호출된다. 여기서는 테스트가 서로 영향이 없도록 항상 새로운 객체를 생성하고, 의존관계도 새로 맺어준다
    • @AfterEach : 각 테스트가 종료될 때 마다 이 기능을 실행한다. 여기서는 메모리 DB에 저장된 데이터를 삭제
      (테스트는 각각 독립적으로 실행되어야 한다.
      테스트 순서에 의존관계가 있는 것은 좋은 테스트가 아니다.)
    • @Test : given/when/then 구조로 사용
    • org.assertj.core.api.Assertions.* 사용
  • 회원 서비스 개발 : 회원가입(중복 회원 검증), 전체 회원 조회

🎈스프링 빈과 의존관계(스프링 빈을 등록하는 2가지 방법)

1. 컴포넌트 스캔과 자동 의존관계 설정

(주로 정형화된 컨트롤러, 서비스, 리포지토리)

  • @Controller annotation으로 만들어진 컨트롤러에 @Autowired 설정
  • 생성자에 @Autowired가 있으면 스프링이 객체 생성 시점에 연관된 객체를 스프링 컨테이너에서 찾아서 넣어준다
    (*생성자가 1개만 있으면 @Autowired 는 생략할 수 있다)
  • 객체 의존관계를 외부에서 넣어주는 것을 DI (Dependency Injection),
    의존성 주입이라 한다

    참고: DI에는 필드 주입, setter 주입, 생성자 주입 이렇게 3가지 방법이 있다. 의존관계가 실행중에 동적으로 변하는 경우는 거의 없으므로 생성자 주입을 권장한다.

  • 컴포넌트 스캔 원리
    -- @Component 애노테이션이 있으면 스프링 빈으로 자동 등록된다
    -- @Controller, @Service, @Repository annotatin도 @Component를 포함한다
  • 스프링은 스프링 컨테이너에 스프링 빈을 등록할 때, 기본으로 싱글톤으로 등록한다(유일하게 하나만 등록해서 공유한다. 따라서 같은 스프링 빈이면 모두 같은 인스턴스다

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

(정형화 되지 않거나, 상황에 따라 구현 클래스를 변경해야 할 때)

  • Configuration 파일 생성(@Configuration annotation)
  • @Bean annotation을 통해 직접 스프링 빈 등록

++ 참고: 3. XML로 설정하는 방식도 있지만 최근에는 잘 사용하지 않으므로 생략한다

회원 등록 / 회원 조회 MVC 개발

  • Controller에서 @GetMapping("경로"), @PostMapping("경로")

🎈스프링 DB 접근 기술

실무에서는 JPA스프링 데이터 JPA를 기본으로 사용
복잡한 동적 쿼리를 Querysdl이라는 라이브러리 사용
(쿼리로 자바 코드 안전하게 작성 가능, 동적 쿼리도 편리하게 작성 가능)
이 조합으로 해겨하기 어려운 쿼리
... JPA가 제공하는 네이티브 쿼리 / 스프링 Jdbc Template 사용

  • H2 데이터 베이스 : 개발이나 테스트 용도로 가볍고 편리한 DB, 웹 화면 제공
  • 순수 Jdbc : 고대 개발자들(20년 전 개발자들)이 쓴 방식
  • 스프링 통합 테스트 : 스프링 컨테이너와 DB까지 연결한 통합 테스트
    (스프링 컨테이너와 통합된 테스트보다는 순수한 테스트가 더 낫다!)
    -- @SpringBootTest : 스프링 컨테이너와 테스트를 함께 실행한다
    -- @Transactional : 테스트 케이스에 이 애노테이션이 있으면, 테스트 시작 전에 트랜잭션을 시작하고, 테스트 완료 후에 항상 롤백한다. 이렇게 하면 DB에 데이터가 남지 않으므로 다음 테스트에 영향을 주지 않는다.
  • 스프링 JdbcTemplate :
    -- JDBC API에서 본 반복 코드를 대부분 제거해준다.
    -- 하지만 SQL은 직접 작성해야 한다.
    -- 실무에서 종종 사용
  • JPA :
    -- 기존의 반복 코드는 물론이고
    -- 기본적인 SQL도 JPA가 직접 만들어서 실행해준다
    -- SQL과 데이터 중심의 설계에서 객체 중심의 설계로 패러다임을 전환을 할 수 있다
    -- @Entity, @Id, @GeneratedValue 등 사용
    -- 서비스 계층에 트랜잭션 추가(@Transactional) -> JPA를 통한 모든 데이터 변경은 트랜잭션 안에서 실행해야 한다
  • 스프링 데이터 JPA
    -- 인터페이스 만으로 개발을 완료 가능
    -- 기본 CRUD 기능도 스프링 데이터 JPA가 모두 제공
    -- 인터페이스를 통한 기본적인 CRUD 제공
    -- findByName() , findByEmail() 처럼 메서드 이름 만으로 조회 기능 제공
    -- 페이징 기능 자동 제공

🎈AOP

AOP : Aspect Oriented Programming

  • 공통 관심 사항(cross-cutting concern)을 처리하고 싶을 때
    (vs 핵심 관심 사항(core concern)
    (ex.) 모든 메소드의 호출 시간 측정

프록시(Proxy)는 "대리"의 의미로, 인터넷과 관련해서 쓰이는 경우, 특히 내부 네트워크에서 인터넷 접속을 할 때에, 빠른 액세스나 안전한 통신등을 확보하기 위한 중계서버를 "프록시 서버"라고 일컫는다. 클라이언트와 Web서버의 중간에 위치하고 있어, 대신 통신을 받아 주는 것이 프록시 서버이다.

profile
🏛️❄💻😻🏠

0개의 댓글

관련 채용 정보