스프링 입문

존스노우·2021년 12월 13일
0

스프링

목록 보기
11/22

인프런 학습시절 스프링 입문 복습 페이지.

토비의 스프링을 읽었으나 완벽히 이해가 되지않아서

스프링을 되짚어 보는 의미랑 복습 의미로 이 강의를 리뷰한다.

페이지는 타입리프로 ..

스프링 부트가 제공하는 Welcome Page 기능

static/index.html 을 올려두면 Welcome page 기능을 제공한다.

컨트롤러 부분과 화면 페이지

타임 리프 문법.

"" 안에 ${data} 주로 이런식 문법 .

컨트롤러에서 viewResolver 가 화면을 찾아서 처리함.

스프링 부트 템플릿엔진 기본 viewName 매핑

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

스프링 웹 개발 기초.

  1. 정적 컨텐츠

  2. MVC와 템플릿 엔진

3.API

정적 컨텐츠

스프링 부트 정적 컨텐츠 기능

MVC와 템플릿 엔진

정적컨텐츠는 컨트롤러를 거치지 않고 바로 그냥 화면에 보여주는 ?

정적 컨텐츠는 static -> html 파일 웰컴페이지.

static -> template 여기서 컨트롤러 매핑으로 들어가는듯

API

ResponsBody 어노테이션 추가.

뷰 리졸버를 사용하지 않는다.

JSON으로 변환 .

회원 관리 예제 - 백엔드 개발..

회원 도메인과 리포지 토리 만들기.

도메인 객체 멤버 / 레파지토리 인터페이스 / 레파지토리 구현체 생성.

회원 리포지토리 테스트 케이스 작성

리포지토리 테스트는 구현체를 테스트한다.

회원 서비스 개발

회원 서비스에서는 DI가 가능하게해서 레포지토리를 변경가능하기 쉽게 만든다.

스프링 빈과 의존관계.

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

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

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

생성자에 오토와이드가 있으면 스프링이 연관된 객체를 스프링 컨테이너에서 찾아서 넣어줌.
이렇게 객체 의존관계를 외부에서 넣어주는 것을 DI 의존성 주입이라고 함.

테스트에서는 개발자가 직접주입 여기서는 오토와이어드가 스프링에 주입해줌.

스프링 빈에 등록이 안돼있음 오류가 뜸.

@Controller 자동등록 됨.

스프링 빈 등록하는 2가지 방법.

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

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

컴포넌트 스캔 원리

@Component / @Controller / @Service /@Repository

생성자가 1개 있을면 오토와이어드 생략 가능.

스프링은 스프링 컨테이너에 스프링 빈을 등록 할때 기본적 으로 싱글톤**으로 등록함
(유일하게 하나만 등록해서 공유) 따라서 같은 스프링 빈이면 모두 같은 인스턴스임.
대부분 싱글톤으로 사용함. 설정으로 안하게 할 수도 있지만.

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

초창기 코드 . / 작성한 코드는 이미 수업을 다 진행된 상태라 ..

XML 방식은 최근에 잘 사용하지 않음

생성자 주입을 권장함.

실무에서는 컨트롤러 서비스 리포지토리 같은 코드는 컴포넌트 스캔 사용.
정형화 되지않거나 상황에 따라 구현 클래스를 변경해야 하면 설정을 통해 스프링 빈으로 등록

오토와이어드를 통한 DI는 컨트롤러 서비스 등과 같이 스프링이 관리하는 객체에서만 동작함.
스프링 빈으로 등록하지 않으면 사용할 수 없다.

회원 관리 예제 - 웹 MVC 개발

홈 화면 / 홈 컨트롤러 추가

** 컨트롤러가 정적 파일보다 우선순위가 높다.

등록

스프링 DB 접근기술

1.H2 데이터베이스 설치
2.순수 Jdbc
3.스프링 통합 테스트
4.스프링 JdbcTemplate
5.JPA
6.스프링 데이터 JPA

1. H2

2. 순수 JDBC

위에 프로퍼티 추가 H2 설치는 생략한다 .


예전 개발자는 이런식으로 개발했다 참고만.

DataSource는 데이터베이스 커넥션을 획득할 때 사용하는 객체.
스프링 부트는 데이터베이스 커넥션 정보를 바탕으로 DataSource를 생성하고 스프링 빈으로 만들어 둠 그래서 DI 받을수 있다.

개방-폐쇄의 원칙

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

스프링 DI 를 사용하면 기존 코드를 손대지 않고 설정만으로 구현 클래스 변경 가능

@SpringBootTest : 스프링 컨테이너와 테스트를 함께 실행한다
@Transactional: 테스트 케이스에 이 애노테이션이 있으면, 테스트 시작 전에 트랜잭션을 시작하고, 테스트 완료 후에 항상 롤백한다.

스프링 JdbcTemplate

jdbc와 동일한 환경
SQL은 직접 작성해줘야되고 코드 대부분이 간소화 되었다.

빈 변경..

JPA

기존 반복 코드 및 SQL도 JPA가 만들어 실행 시켜준다.

JPA 사용히 SQL 과 데이터 중심 설계에서 객체 중심의 설계로 패러다임을 전환을 할 수 있다.
JPA를 사용하면 개발 생산성을 크게 높일 수 있다.

기존 멤버 객체 JPA 셋팅

스프링 데이터 JPA

스프링 데이터 JPA는 SpringDataJpaMemberRepository를 자동으로 스프링 빈으로 등록 해줌.

스프링 데이터 JPA 제공 기능

CRUD

findByName() 등 메서드 이름만으로 조회 기능 제공

페이징 기능 자동 제공.

실무에서는 JPA/ 스프링 데이터 JPA 기본 사용

복잡한 동적 쿼리는 Querydsl 이라는 라이브러리.

AOP

AOP 가 필요한 상황

  1. 모든 메소드의 호출 시간을 측정하고 싶다면?

  2. 공통 관심 사항(cross-cutting concern) vs 핵심관심 사항 (core concern)

  3. 회원 가입 시간, 회원 조회 시간을 측정하고 싶다면?

문제점들..

회원가입, 회원 조회에 시간을 측정하는 기능은 핵심 관심 사항이 아니다.
시간을 측정하는 로직은 공통 관심 사항이다.
시간을 측정하는 로직과 핵심 비즈니스의 로직이 섞여서 유지보수가 어렵다.
시간을 측정하는 로직을 별도의 공통 로직으로 만들기 매우 어렵다.
시간을 측정하는 로직을 변경할 때 모든 로직을 찾아가면서 변경해야 한다.

AOP 적용

Aspect Oriented Programming

공통 관심 사항 vs 핵심 관심 사항 분리

profile
어제의 나보다 한걸음 더

0개의 댓글