Spring/강의

스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술(정리)

feel2 2023. 4. 27. 22:02
반응형

 

인텔리제이 꿀 단축기
  • ctrl + R : 이전에 실행했던 것 그대로 실행시켜 줌(테스트할 때 유용)
  • option + cmd + shift + L : 라인, import 정리
  • cmd + option + v : 리턴 객체 자동 할당
  • shift + F6 : 붙여넣기 한 것들 renaming
  • cmd + E : 최근 봤던 파일 목록 보여 줌
  • option + Enter : static import 등록(테스트에 유용)
  • cmd + shift + T : test class 자동으로 생성해 줌
  • cmd + N : 생성자, 테스트 케이스 생성 도와 줌
  • ctrl + T : refactoring something (inline value 꿀팁!!)

 

스프링 꿀팁
  • 통합 테스트 보다는 단위 테스트를 잘 만들어야 좋은 테스트다.
  • @SpringBootTest 를 붙여주면 스프링을 실제로 기동하고 테스트를 진행함.
  • @Transactional 이 테스트 class 에 붙어 있으면 테스트가 끝날 때 마다 항상 rollback 해 준다.
  • 테스트는 항상 given, when, then 순서대로 진행한다.
  • 테스트 메서드 명은 항상 영어일 필요는 없다.
  • 스프링 빈을 등록하는 방법은 2가지가 있다.
    • a) 컴포넌트 스캔과 자동 의존관계 설정에 따른 빈 등록
    • b) 자바 코드로 직접 스프링 빈 등록
  • a) @Component 를 붙여주면 처음 스프링이 기동될 때 컴퍼넌트 스캔이 되면서 빈을 등록해 준다.
  • 빈을 주입할 때 생성자로 빈 주입할 경우(only 생성자가 하나일 때) @Autowired 가 생략 가능하다.(참고로 빈 주입에는 )
  • @Component를 포함하는 다음 어노테이션도 스프링 빈으로 자동 등록된다.
    • @Controller
    • @Service
    • @Repository
  • DI에는 총 3가지가 있다
    • 필드 주입
    • setter 주입
    • 생성자 주입
  • 여기서 생성자 주입을 권장한다.

 

섹션 2. 스프링 웹 개발 기초

  • MVC와 템플릿 엔진

- Controller

@Controller
public class HelloController {

    @GetMapping("hello")
    public String hello(Model model){
        model.addAttribute("data","hello!!");
        return "hello";

    }
}

- View

resources/templates/hello.html

<!DOCTYPE HTML>
<html xmlns:th="http://www.thymeleaf.org">
<head>
    <title>Hello</title>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
</head>
<body>
<p th:text="'안녕하세요. ' + ${data}" >안녕하세요. 손님</p>
</body>
</html>

- 실행

http://localhost:8080/hello

 

 

  • API

- @ResponseBody

@ResponseBody 를 사용하면 viewResoler를 사용하지 않음

대신 HTTP의 body에 문자 내용을 직접 반환함.

더 자세한 로직을 살펴보면

  • HTTP의 body에 문자 내용을 직접 반환
  • viewResovler 대신에 HttpMessageconverter 가 동작
  • 기본 문자 처리 : StringHttpMessageConverter
  • 기본 객체 처리 : MappingJackson2HttpMessageConverter
  • byte 처리 등등 기타 여러 HttpMessageConverter 가 기본으로 등록되어 있음

섹션 3. 웹 MVC

  • 컨트롤러 : 웹 MVC의 컨트롤러 역할을 함
  • 서비스 : 핵심 비즈니스 로직을 구현 함
  • 리포지터리 : DB에 접근, 도메인 객체를 DB에 저장하고 관리 함
  • 도메인 : 비즈니스 도메인 객체 역할을 함(ex) 회원, 주문, 쿠폰 등등), 주로 DB에 저장하고 관뢰 됨

  • 보통 인터페이스로 구현 클래스를 쉽게 변경가능하도록 설계 함.
  • 개발 초기 단계에는 구현체로 가벼운 메모리 기반의 데이터 저장소 사용

테스트 케이스 작성

  1. src/test/java/ 밑에 똑같은 디렉토리 구조로 하위 폴더를 생성한다.
  2. 테스트 케이스를 작성한다.
    - 테스트 케이스 작성 예
    hello/hellospring/repository/MemoryMemberRepositoryTest
package hello.hellospring.repository;

import hello.hellospring.domain.Member;
import org.junit.jupiter.api.AfterEach;
import org.junit.jupiter.api.Test;

import java.util.List;

import static org.assertj.core.api.Assertions.assertThat;


// 테스트는 순서와 상관없이 실행되어야 한다.
// 객체의 정합성을 테스트 한다.

class MemoryMemberRepositoryTest {

    MemoryMemberRepository repository = new MemoryMemberRepository();

    @AfterEach
    public void afterEach() {
        repository.clearStore();
    }

    @Test
    public void save() {
        Member member = new Member();
        member.setName("spring");

        repository.save(member);

        Member result = repository.findById(member.getId()).get();
        assertThat(member).isEqualTo(result);

    }

    @Test
    public void findByName() {
        Member member1 = new Member();
        member1.setName("spring1");
        repository.save(member1);

        Member member2 = new Member();
        member2.setName("spring2");
        repository.save(member2);

        Member result = repository.findByName("spring1").get();

        assertThat(result).isEqualTo(member1);

    }

    @Test
    public void findAll() {
        Member member1 = new Member();
        member1.setName("spring1");
        repository.save(member1);

        Member member2 = new Member();
        member2.setName("spring2");
        repository.save(member2);

        List<Member> result = repository.findAll();

        assertThat(result.size()).isEqualTo(2);
    }


}
  • @Test 를 붙이면 Test 할 function으로 인식한다.
  • 보통 Test Class 의 명명 규칙은 ...Test 라고 한다.
  • 보통 Repository Test를 먼저 작성하고 Service Test를 작성한다.
  • JPA 와 Spring Data JPA 완전 다른 것이다.
  • 테스트를 할 떄 중요한 원칙 5가지가 있다.(FIRST)
    • F(Fast) : 테스트는 빠르게 수행되어야 한다.
    • I(Independent) : 테스트는 독립적으로 수행되어야 한다.
    • R(Repeatable) : 테스트는 반복적으로 수행해도 결과가 같아야 한다.
    • S(Self-Validating) : 테스트는 자체적으로 검증 가능해야 한다.
    • T(Timely) : 테스트는 적시에 작성되어야 한다.(TDD 에서는 중요!!!!)

섹션 7. AOP

  • 공통 관심 사항 (cross-cutting concern) VS 핵심 관심 사항(core concern) 분리해서 생각해야 함.
  • AOP 는 공통 관심 사항에 대한 것만 관련해서 적용

 

참고 : https://www.inflearn.com/course/%EC%8A%A4%ED%94%84%EB%A7%81-%EC%9E%85%EB%AC%B8-%EC%8A%A4%ED%94%84%EB%A7%81%EB%B6%80%ED%8A%B8
반응형