효습

스터디 1주차 본문

스터디/Spring

스터디 1주차

효효효효 2023. 4. 5. 02:20
  • 요즘에는 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)라고 함
    Controller
    • MemberController가 MemberService를 통해서 회원가입하고 MemberService를 통해서 데이터를 조회할 수 있어야함 → 의존 관계에 있어야 함
    • 스프링 처음 뜰 때 , 스프링 컨테이너라는 스프링 통이 생김 →거기에 @Controller 라는 어노테이션이 있으면 MemberController 객체를 생성해서 스프링에 넣어둠 → 스프링에서 관리함
      • 스프링 컨테이너에서 스프링 빈이 관리된다고 표현
        • 스프링이 관리를 하게되면 다 스프링 컨테이너에 등록을 하고 스프링 컨테이너에서 받아서 쓰도록 바꿔야 함
        • controller에서 new로 MemberService 객를 새로 생성할 수 있지만 보면 별 게 없어 ,,,, 인스턴스를 여러개 생성할 필요가 없어 → 스프링 컨테이너에 등록을 하고 쓰면 됨
        • @Autowired 어노테이션을 쓰면 스프링이 스프링 컨테이너에 있는 MemberService와 연결을 해줌
        • MemberService에서 @Service 어노테이션을 써줘야함 그래야 스프링이 단순 자바 객체가 아닌 줄 알고 스프링 컨테이너에 MemberService를 등록해줌
        • 리포지토리에도 @Repository 어노테이션을 넣어줌
        • 컨트롤러를 통해서 외부 요청을 받고 → 서비스에서 비즈니즈 로직을 만들고 → 리포지토리에서 데이터를 저장하고
        • 정형화된 패턴임
    스프링 빈을 등록하는 2가지 방법
    • 컴포넌트 스캔과 자동 의존관계 설정 (컴포넌트 스캔이라고 함)
      • 스프링이 올라올 때 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랑 연결할 때)
  • 컴포넌트 스캔을 사용했다면 여러가지 바꿔야하는데 스프링 빈으로 등록했다면 설정 파일만 수정하면 됨