효습
스터디 1주차 본문
- 요즘에는 gradle을 거의 다 씀 예전에는 Maven 많이 썼었음
- tomcat이라는 웹서버를 내장하고 있어서 tomcat이라는 웹서버를 자체적으로 띄우면서 스프링도 같이 올라옴
- 로그로 남겨야 에러만 모아볼 수 있고 로그만 모아 볼 수 있음
- 컨트롤러에서 리턴 값으로 문자를 반환하면 뷰 리졸버
viewResolver
가 화면을 찾아서 처리한다.- 스프링 부트 템플릿엔진 기본 viewName 매핑
resources:templates/
+{viewName}
+.html
스프링 웹 개발 기초
- 정적 컨텐츠
- 파일을 그대로
- 내장 톰캣 서버가 요청을 받으면 스프링한테 넘김 → 그러면 스프링은 컨트롤러쪽에 있는지 찾아봄 → 없으면 resources에서 찾아서 반환해줌
- MVC와 템플릿 엔진
- 서버에서 좀 변형을 해서 보내줌
- MVC: Model, View, Controller
- 컨트롤러랑 뷰를 쪼개는 게 기본
- 뷰는 화면에 관련된 일만 , 비즈니즈 로직이나 등등 관련된 건 컨트롤러 , 모델에 관련된 걸 담아서 화면에 넘겨줌
- view resolver : 뷰를 찾아주고 템플릿 엔진을 연결해줌
- 연결해주면 템플릿 엔진 렌더링을 해서 변환을 한 html을 웹 브라우저에 반환함
- API
@ResponseBody
: body 부분에 내가 직접 이걸 넣겠다.- 템플릿 엔진이랑 다르게 뷰가 없음 , 그대로 데이터를 내려줌
- 내장 톰캣을 통해서 스프링이 요청을 건네받았는데
@ResponseBody
가 있으면 http 응답에 그대로 이 데이터를 넣으면 되겠구나 생각함 → 근데 객체를 반환이 되면 기본이 json 방식으로 데이터를 만들어서 http 응답에 넣음( 객체가 아니고 문자열이면 HttpMessageConverter가 StringConverter가 동작함) - 클라이언트의 HTTP Accept 해더와 서버의 컨트롤러 반환 타입 정보 둘을 조합해서 HttpMessageConverter 가 선택함
- 모든 테스트 순서랑 상관없이 따로 동작하게 설계를 해야함
- 테스트가 끝나고 나면 데이터를 clear 해줘야함
@afterEach
: 메서드가 끝날 때마다 동작
- 테스트 클래스를 먼저 작성하고 멤버 리포지토리를 작성할 수도 있음
- 테스트 주도 개발 → TDD
- 테스트 관련해서 깊이있게 공부하기
- Optional을 바로 반환하는 게 좋지는 않음
- 서비스 클래스는 비즈니스에서 가져온 단어를 써야함 비즈니즈에 의존적으로 설
- 리포지토리는 단순히 개발적으로? 이름을 지음
- 테스트코드는 한글로 적어도 됨 , 빌드될 때 포함되지 않아서 괜찮음
give
-when
-then
방식으로 테스트 코드 작성하기- 외부에서 memberRepository를 MemberService에 넣어줌
- MemberService 입장에서 의존성을 넣어줌
- 이런 걸 dependency injection(DI)라고 함
- MemberController가 MemberService를 통해서 회원가입하고 MemberService를 통해서 데이터를 조회할 수 있어야함 → 의존 관계에 있어야 함
- 스프링 처음 뜰 때 , 스프링 컨테이너라는 스프링 통이 생김 →거기에
@Controller
라는 어노테이션이 있으면 MemberController 객체를 생성해서 스프링에 넣어둠 → 스프링에서 관리함- 스프링 컨테이너에서 스프링 빈이 관리된다고 표현
- 스프링이 관리를 하게되면 다 스프링 컨테이너에 등록을 하고 스프링 컨테이너에서 받아서 쓰도록 바꿔야 함
- controller에서 new로 MemberService 객를 새로 생성할 수 있지만 보면 별 게 없어 ,,,, 인스턴스를 여러개 생성할 필요가 없어 → 스프링 컨테이너에 등록을 하고 쓰면 됨
@Autowired
어노테이션을 쓰면 스프링이 스프링 컨테이너에 있는 MemberService와 연결을 해줌- MemberService에서
@Service
어노테이션을 써줘야함 그래야 스프링이 단순 자바 객체가 아닌 줄 알고 스프링 컨테이너에 MemberService를 등록해줌 - 리포지토리에도
@Repository
어노테이션을 넣어줌 - 컨트롤러를 통해서 외부 요청을 받고 → 서비스에서 비즈니즈 로직을 만들고 → 리포지토리에서 데이터를 저장하고
- 정형화된 패턴임
- 스프링 컨테이너에서 스프링 빈이 관리된다고 표현
- 컴포넌트 스캔과 자동 의존관계 설정 (컴포넌트 스캔이라고 함)
- 스프링이 올라올 때 Component와 관련된 어노테이션이 있으면 걔네를 스프링이 다 객체를 생성해서 스프링 컨테이너에 등록을 함
@Autowired
연관관계, 연결해줌- 스프링을 쓰려면 웬만한 것들은 스프링 빈에 등록을 해서 사용해야함 그렇게 해야 얻는 이점이 있음
- 스프링은 스프링 컨테이너에 스프링 빈을 등록할 때, 기본으로 싱글톤으로 등록한다. (유일하게 하나만 등록해서 공유한다) 설정으로 싱글톤이 아니게 설정할 수 있지만 , 특별한 경우를 제외하면 대부분 싱글톤을 사용한다.
- 자바 코드로 직접 스프링 빈 등록하기
import hello.hellospring.repository.MemberRepository;
import hello.hellospring.repository.MemoryMemberRepository;
import hello.hellospring.service.MemberService;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class Springconfig {
@Bean
public MemberService memberService(){
return new MemberService(memberRepository());
}
@Bean
public MemberRepository memberRepository(){
return new MemoryMemberRepository();
}
}
MemberService랑 MemberRepository를 스프링 빈에 등록을 하고 스프링 빈에 등록되어있는 MemberRepository를 MemberService에 넣어줌
import hello.hellospring.service.MemberService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
@Controller
public class MemberCotroller {
private final MemberService memberService ;
@Autowired
public MemberCotroller(MemberService memberService) {
this.memberService = memberService;
}
}
dependency injection에는 3가지 방법
- 생성자를 통해서 들어오는 방법
- 의존관계가 실행중에 동적으로 변하는 경우는 거의 없으므로 권장함 (서버가 떠있는데 중간에 바뀌는 거가 거의 없다는 뜻임)
- 필드에다가 주입
- 별로 안좋음, 중간에 내가 바꿀 수 있는 방법이 없음
- setter 주입
- 누군가가 컨트롤러로 호출했을 때. public으로 열려있어야함
상황에따라 구현 클래스를 변경해야 하면 설정을 통해 스프링 빈으로 등록한다.(나중에 MemoryMemberRepository를 다른 DB랑 연결할 때)
- 컴포넌트 스캔을 사용했다면 여러가지 바꿔야하는데 스프링 빈으로 등록했다면 설정 파일만 수정하면 됨
'스터디 > Spring' 카테고리의 다른 글
스프링컨테이너와 스프링 빈 (0) | 2023.06.25 |
---|---|
스프링 핵심 원리 이해2 - 객체 지향 원리 적용 (0) | 2023.06.21 |
스프링 핵심 원리 이해1 - 예제 만들기 (0) | 2023.05.03 |
객체 지향 설계와 스프링 (0) | 2023.05.03 |
스터디 2주차 (0) | 2023.04.15 |