본문 바로가기

공부기록/인터넷 강의

스프링 입문 복습(2회차)

start.spring.io에서 프로젝트 생성

Spring web

  • tomcat ( 톰캣 서버 포함)

스프링 웹 mvc

thymeleaf : 템플릿 엔진

starter

spring-core

-logging(slf4j, logback)

  • test

mockito 테스트 도와주는 것

junit 테스트 프레임 워크

assertj 테스트 코드를 더 편하게 작성하게 도와주는 라이브러리

spring-test: 통합 테스트 작성

항상 spring.io → spring boot feature

을 참조하기

컨트롤러( 웹 애플리케이션의 최초 진입점)

배포: 이제는 jar 파일하나만 실행시키면 됨

mvc에서 view를 사용하는 방법

  • 정적 컨텐츠, 템플릿 엔진, API

정적 컨텐츠 : 고정적인 html 파일을 사용

템플릿 엔진: 타임리프를 사용하여 html 파일의 태그를 교체함

(사용자에게 전송하는 목적)

API: view를 돌려주지 않고 JSON format의 데이터를 전송함

(다른 서비스와 통신하는 방법)

HttpMessageConverter ( JsonConverter, StringConverter) 객체 처리, 문자처리

컨트롤러 → 서비스 → 리포지토리 → DB

( 모든 객체가 참조 : 도메인)


메모리 구현체로 일시적으로 사용할 수 있음

MemoryMemberRepository → 그런데 JPA 사용하면 바로 구현할 수 있을 텐데

Optional → 정리하자

테스트는 순서 보장 X

→ 모두 독립적으로 실행될 수 있도록 설계해야 함

TDD: 테스트를 먼저 작성. 여기서는 안 나오지만, 테스트를 먼저 작성함으로써 설계에 대한 확인을 다시 할 수 있음

AfterEach, BeforeEach → DB에 저장된 데이터를 삭제함

DI: 의존성 주입

스프링 빈과 의존관계

Autowired로 연관된 객체를 스프링 컨테이너에서 찾아서 주입해줌.

  • 컴포넌트 스캔과 자동 의존관계 설정
  • 자바 코드로 직접 스프링 빈 등록하기

→ 여기서 프로젝트 전체의 설정 같은 것은 수동 등록 빈으로 하고,

→ 그 외의 것은 컴포넌트 스캔 같은 것을 사용하는 게 나음

Componet, Controller, Service, Repositroy는 컴포넌트 스캔 대상( Component를 가지고 있기 때문)

스프링 빈: 싱글톤을 기본으로 사용함, 프로토타입 빈도 있음

싱글톤 빈으로 한 번만 등록됐을 때의 이득

→ repository를 사용하는 곳이 많아도, 같은 인스턴스로서 하나의 repository 인스턴스가

여러 번 사용됨 → 컨테이너는 즉, 사용자가 편리하게 개발할 수 있도록, 미리 설정을 다 해주는 것

필드 주입, 생성자 주입, setter 주입이 있는데, 생성자 주입을 주로 사용함

필드 주입은 사용 안 함

메모리 레포지토리 → 다음으로 테스트할 수 있는 h2 데이터베이스

애플리케이션 실행 시 h2를 실행시킬 수도 있지만, 여기서는 설치하여 실행함


데이터 저장 기술의 발전

jdbc, h2 드라이버를 import

memberRepository를 extends 하여 생성하여,

MemoryMemberRepository를 JdbcMemberRepository로 레포지토리를 교체

OCP: 확장에는 열려있고, 수정, 변경에는 닫혀 있다.

DI를 사용하면 기존 코드를 손대지 않고, 설정만으로 구현 클래스를 교체할 수 있음

( 같은 역할을 담당하는 객체의 종류가 바뀌는 것 → 데이터 저장소에 저장한다는 역할은 같고, 어떻게 저장할지는 자율성에 맡김)

SpringBootTest: 컨테이너와 테스트를 함께 실행함( 속도가 느려질 수 있음)

Transactional: Test에 붙어있으면, 테스트 완료 후에 항상 롤백, commit 어노테이션을 사용하면 DB에 남아 있음

JdbcTemplate: jdbc의 반복 코드를 대부분 제거해주지만, 쿼리는 직접 작성해야 함

RowMapper → ResultSet을 그에 해당하는 데이터 객체로 바꿈

List <Member> result = jdbcTemplate.query("select * from member where name =?", memberRowMapper(), name);

ResultSet이 List <Member>으로 memberRowMapper에 의해 변환됨

JPA

더 이상 쿼리를 작성하지 않아도 됨( 물론 작성해야 하는 경우도 있음)

쿼리를 다루는 시간을 절약하여 설계나 개발에 더 많은 시간을 사용할 수 있음

객체 지향 패러다임 ↔ 관계형 테이블

두 개의 차이점을 극복시켜서, 객체 지향처럼 사용할 수 있게 해 줌 → 기존에는 이런 작업들을 개발자들이 해줘야 했는데, 이제는 그런 것들을 JPA에서 이미 해주는 느낌

show-sql 옵션: JPA가 생성하는 sql을 콘솔에서 확인

ddl-auto: 테이블을 자동으로 생성하는 기능 → 실제 배포 때는 키면 안 됨, 하지만 테스트 용도로는 만들었다가 지웠다가 하면 좋을 것 같음

Transactionl → JPA의 모든 DB 관련 작업은 트랜잭션 내부에서 실행되어야 함 → 영속성 콘텍스트로 관리되어야 함

JpaRepository를 pulbic interface로 상속받으면 findById, findAll 같은 함수들을 알아서 생성해줌

또한 findByName → 함수 이름을 파싱 하여 where조건절을 자동으로 생성하는 함수를 만들어줌

AOP: AOP(annotation)를 직접 작성할 수 있음. 예를 들면 시간 측정 로직을 사용하고 싶은데, 모든 함수의 시작과 끝에 넣기 불편할 수 있음. Annotation에 정의하고, Annotation을 붙이는 것으로 컴파일시 프록시 객체에 해당 함수의 시작과 끝에 시간 측정로직을 실행하도록 수정함

'공부기록 > 인터넷 강의' 카테고리의 다른 글