카테고리 없음

김영한 스프링 입문 완강

테토 2023. 5. 20. 02:12
반응형

 

아직 잘 모르겠고 진짜 맛만 본 느낌 얼레벌레 따라가며 오..신기한데.. 이러면서 완강했다 

들으면서 남긴 노트들 기록

 
 
 
 
프로젝트 환경설정
프로젝트 생성

spring initializr - 스프링에서 운영하고 있는 사이트 프로젝트 생성하게 해줌

gradle이 버전 설정하고 라이브러리 땡겨오는구나~

dependencies 에 있는 것들을 repositories에 적은곳에서 다운받어라

 

 

tomcat 웹서버 내장하고 있음

라이브러리 살펴보기

인텔리제이에서 우측 gradle -> dependencies에서 라이브러리 의존관계 확인가능

View 환경설정

resources/static/index.html 경로는 스트링부트가 제공하는 welcome page 기능

spring.io의 learn의 reference document에서 정보를 잘 찾는 능력 필요

<html xmlns:th="http://www.thymeleaf.org">

사용하면 thymeleaf 문법 사용가능

localhost:8080/hello 하면 hello가 컨트롤러의 @GetMapping("hello")와 매칭되어서 매서드 실행.

return "hello"는 resourses/templates의 hello.html을 찾아서 thymeleaf 템플릿엔진 처리 -> 뷰리졸버가 함

model(data:hello!!)가 키값으로 가서 hello.html실행시 data부분이 hello!!로 대체됨

빌드하고 실행하기

cmd 창에서 gradlew build 하면 build/libs에 jar파일 생성됨 -> 실행하면 인텔리제이에서와 동일하게 작동

gradlew clean build 빌드 초기화

스프링 웹 개발 기초
정적 컨텐츠

resourses/static 에 hello-static.html 파일 만들어 넣으면 localhost8080:hello-static.html 들어가면 html파일 열림

컨트롤러쪽에 hello-static이 있는지 먼저 확인함 없으면 resources로 가서 찾아서 반환한다 우선순위는 컨트롤러 먼저

MVC와 템플릿 엔진

MVC : Model, View, Controller

localhost:8080/hello-mvc 하면 컨트롤러가 자기가 hello-mvc 가지고있는거 확인함 메서드 호출 return hello-templat model(name:spring)

viewResolver가 templates/hello-template.html찾아서 템플릿엔진에게 넘겨서 처리

API

MVC방식은 소스코드 보기에서 HTML코드가 보이지만 API는 그냥 바로 보여짐

@ResponsBody

 

generate 단축기 alt+insert

private 접근할때 getter and setter를 사용

@ResponseBody 없을때-> 뷰리졸버한테 줌

있으면 그냥 http응답에 바로 넘겨줌

객체를 주면 json방식으로 데이터를 만들어서 http응답에 반환함

뷰리졸버가 아닌 HttpMessageConverter가 반응함

객체일때는 JsonConverter, 문자일때는 StringConverter

정적컨텐츠 - 파일을 그대로 내려준다

mvc - 모델뷰컨트롤러로 나누어서 렌더링한 html을 전달한다

api - 객체를 반환한다

회원 관리 예제 - 백엔드 개발
비즈니스 요구사항 정리

웹어플리케이션 구조

컨트롤러 - > 웹mvc 컨트롤러

서비스: 핵심 비즈니스 로직 구현(회원은 중복가입이 안된다 등)

도메인: 데이터베이스에 주로 저장하고 관리되는 비즈니스 도메인 객체

리포지토리

 

인터페이스 -> 데이터저장소 선정되지 않아서 구현클래스를 변경할수 있도록 설계

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

System.out.println("result = " + (result ==member));

Assertions.assertEquals(member, result);

Assertions.assertThat(member).isEqualTo(result);

member1 복사해서 member2로 바꿀때 shift + f6 하면 한번에 rename가능

테스트케이스는 순서가 랜덤으로 진행되기 때문에 순서에 의존적으로 설계하면 안됨

테스트 여러개하면 하나할때마다 스토어를 비워줘야함

회원 서비스 개발

memberRepository.findByName(member.getName());

에서 ctrl + alt + v 하면

Optional<Member> byName = memberRepository.findByName(member.getName());

회원 서비스 테스트

테스트케이스 문서 만드는 단축키 ctrl + shift + T

테스트케이스 만들때 given, when, then 주석을 달면 알아보기 쉬움

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

멤버컨트롤러가 멤버서비스를통해서 조회하고 회원가입하는것을 의존관계라고함

컨트롤러 객체가 생성되면 스프링컨테이너에서 관리한다

Autowired사용하면 스프링컨테이너에 있는 memberService 공용으로 사용

@Service해야 스프링컨테이너에ㅓㅅ 샤용가능

@Repository 도 해야함

컨트롤러에서 autowired 서비스

서비스에서 autowired 리포지토리

스프링 DB 접근 기술
순수 JDBC

인터페이스에서 구현체를 바꾸는데 기존코드를 안건드릴수 있는게 객체지향의 진짜 장점!!

스프링 통합 테스트

@SpringBootTest

테스트를 스프링컨테이너와 함께 실행

@Transactional

테스트 할 때 적용하면 테스트를 진행한 후에 DB에 적용된 사항을 적용시키지 않고 롤백함 -> 다음테스트에 영향을 주지않음

스프링컨테이너가 올라오지 않는 테스트를 할 수 있게 해야한다 단위테스트를 잘 만드는게 좋은 테스트~~

JPA

jdbc template -> 반복코드 제거 jdbc보다 훨씬 간단해짐

JPA -> 반복코드 제거 + 쿼리도 제거 ! 대박짱.

jpa

orm - > object, relational, mapping

 

아이디를 직접넣지않고 알아서 생성해주는걸 아이덴티티라고함

스프링 데이터 JPA

스프링데이터에서 기본적인 기능은 모두 만들어놨음

공통이 불가능한 부분들

인터페이스로 됨 findBy ~~

findByName(String name)

복잡한 동적 쿼리는 querydsl이라는 라이브러리 사용하면 자바코드로 작성가능

AOP
AOP 적용

AOP : Aspect Oriented Programming

공통관심사항과 핵심관심사항을 분리하는 것

헉..엄청 간단한데 뭔지 모르겠다

프록시를 이용한다 와우..신기

반응형