스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술_강의 필기

김지민·2024년 9월 1일
0

개발 벨로그 📝

목록 보기
8/10
  • 섹션2

    • 테스트 코드가 중요해지는 추세라서 main과 test로 나뉨

    • 스프링 부트가 제공하는 Welcome Page 기능
      static/index.html 을 올려두면 Welcome page 기능을 제공한다.

      https://docs.spring.io/spring-boot/docs/2.3.1.RELEASE/reference/html/spring-
      boot-features.html#boot-features-spring-mvc-welcome-page

      image.png

    • springboot - devtools: html 파일을 컴파일만 해주면 서버 재시작 없이 View 파일 변경이 가능

      [springboot] spring-boot-devtools 적용 및 사용

    • 빌드하기

      • ./gradlew build
      • cd build
      • cd libs
      • ls -arlth
      • java -jar hello-spring-0.0.1-SNAPSHOT.jar
      • 잘 안되는 경우
      • ./gradlew clean : 빌드 폴더 삭제
      • ./gradlew clean build
  • 섹션3

    정적 컨텐츠 제공 기능

    • 정적 파일 반환 - 프로그래밍 불가

      image.png

      localhost:8080/파일명

      image.png

      MVC와 템플릿 엔진

      image.png

      image.png

    • 타임리프의 장점: 서버없이 파일을 불러와서 실행할 수 있고, 소스코드 확인 가능

    • command+P : 파라미터 정보

      image.png

      image.png

    • mvc 방식 → name= :

      `@GetMapping("hello-mvc")
      public String helloMvc(@RequestParam("name") String name, Model model) {
          model.addAttribute("name", name);    
          return "hello-template";
          }

      API

    • @ResponseBody: 이 어노테이션이 붙은 파라미터에는 http 요청의 본문(body)이 그대로 전달됨

    • command + shift + enter : 코드 완성

    • control + enter : 생성자, Getter, Setter 등 만들 수 있음

    • @ResponseBody: 사용 원리

      image.png

  • 섹션4

    • 일반적인 웹 애플리케이션 계층 구조 image.png 컨트롤러: 웹 MVC의 컨트롤러 역할
      서비스: 핵심 비즈니스 로직 구현
      리포지토리: 데이터베이스에 접근, 도메인 객체를 DB에 저장하고 관리
      도메인: 비즈니스 도메인 객체, 예) 회원, 주문, 쿠폰 등등 주로 데이터베이스에 저장하고 관리됨
    • 회원 리포지토리 테스트 케이스 작성
      • 개발한 기능을 실행해서 테스트 할 때 자바의 main 메서드를 통해서 실행하거나, 웹 애플리케이션의 컨트롤러를 통해
        서 해당 기능을 실행한다. 이러한 방법은 준비하고 실행하는데 오래 걸리고, 반복 실행하기 어렵고 여러 테스트를 한번
        에 실행하기 어렵다는 단점이 있다. 자바는 JUnit이라는 프레임워크로 테스트를 실행해서 이러한 문제를 해결한다.
    • Extract Variable: command + option + V
      • 선택한 표현식을 변수로 추출하여 코드의 가독성을 높이고 중복을 줄이는 데 도움을 줌. 선택한 코드 조각을 변수로 변환할 수 있는 팝업이 나타나며, 원하는 변수 이름을 입력하면 새로운 변수가 생성됨.
    • control + T : 리팩토링과 관련된 여러가지
    • Extract Method: command + Option + M
    • command + shift + T : 클래스에서 테스트 파일 생성
    • 테스트 케이스는 한글로 작성해도 괜찮음 : 실제 코드에 반영되지 않음 image.png
    • control + R : 이전에 실행했던 것을 실행해 줌.
  • 섹션5

    스프링 빈과 의존 관계

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

      • 컴포넌트 스캔과 자동 의존관계 설정
      • 자바 코드로 직접 스프링 빈 등록하기
    • 컴포넌트 스캔 원리

      `@Component` 애노테이션이 있으면 스프링 빈으로 자동 등록된다.
      `@Controller` 컨트롤러가 스프링 빈으로 자동 등록된 이유도 컴포넌트 스캔 때문이다.
      
      - `@Component` 를 포함하는 다음 애노테이션도 스프링 빈으로 자동 등록된다.
          
          `@Controller`
          `@Service`
          `@Repository`
          

      image.png

    • Bean?

      ```
      빈(Bean)빈(Bean)은 스프링 컨테이너에 의해 관리되는 재사용 가능한 소프트웨어 컴포넌트이다.즉, 스프링 컨테이너가 관리하는 자바 객체를 뜻하며, 하나 이상의 빈(Bean)을 관리한다.빈은 인스턴스화된 객체를 의미하며, 스프링 컨테이너에 등록된 객체를 스프링 빈이라고 한다.@Bean 어노테이션을 통해 메서드로부터 반환된 객체를 스프링 컨테이너에 등록한다.빈은 클래스의 등록 정보, Getter/Setter 메서드를 포함하며, 컨테이너에 사용되는 설정 메타데이터로 생성된다.
      ```
      
      > 스프링(Spring) 컨테이너가 관리하는 자바 객체를 빈(Bean)이라 한다.
      > 
      
      스프링의 특징에는 [제어의 역전(IoC)](https://velog.io/@falling_star3/SpringBoot-%EC%8A%A4%ED%94%84%EB%A7%81%EA%B3%BC-%EC%8A%A4%ED%94%84%EB%A7%81-%EB%B6%80%ED%8A%B8)이 있다.
      
      제어의 역전이란, 간단히 말해서 객체의 생성 및 제어권을 사용자가 아닌 스프링에게 맡기는 것이다. 지금까지는 사용자가 new연산을 통해 객체를 생성하고 메소드를 호출했다. IoC가 적용된 경우에는 이러한 객체의 생성과 사용자의 제어권을 스프링에게 넘긴다. 사용자는 직접 new를 이용해 생성한 객체를 사용하지 않고, 스프링에 의하여 관리당하는 자바 객체를 사용한다. 이 객체를 '빈(bean)'이라 한다.

    • @Autowired

      • 생성자에 @Autowired가 있으면 스프링이 연관된 객체를 스프링 컨테이너에 찾아서 넣어준다.
    • 참고 및 주의

      참고: DI에는 필드 주입, setter 주입, 생성자 주입 이렇게 3가지 방법이 있다. 의존관계가 실행중에 동적으 로 변하는 경우는 거의 없으므로 생성자 주입을 권장한다.

      참고: 실무에서는 주로 정형화된 컨트롤러, 서비스, 리포지토리 같은 코드는 컴포넌트 스캔을 사용한다. 그 리고 정형화 되지 않거나, 상황에 따라 구현 클래스를 변경해야 하면 설정을 통해 스프링 빈으로 등록한다.
      주의: @Autowired 를 통한 DI는 helloController , memberService 등과 같이 스프링이 관리하 는 객체에서만 동작한다. 스프링 빈으로 등록하지 않고 내가 직접 생성한 객체에서는 동작하지 않는다.

  • 섹션7

    • h2 연결에 문제가 있을 경우
      • url이 localhost로 시작하는지 확인
      • 지웠다가 다시 접속
        • rm test.mv.db : 파일 삭제 명령어
        • 지우고 처음부터 다시 !!
    • 순수 JDBC ⇒ 지금은 안쓰는 방법으로 편하게 듣기 image.png
    • 스프링 JdbcTemplate 순수 Jdbc와 동일한 환경설정을 하면 된다.
      스프링 JdbcTemplate과 MyBatis 같은 라이브러리는 JDBC API에서 본 반복 코드를 대부분 제거해준 다. 하지만 SQL은 직접 작성해야 한다.
    • JPA JPA는 기존의 반복 코드는 물론이고, 기본적인 SQL도 JPA가 직접 만들어서 실행해준다.
      JPA를 사용하면, SQL과 데이터 중심의 설계에서 객체 중심의 설계로 패러다임을 전환을 할 수 있다.
      JPA를 사용하면 개발 생산성을 크게 높일 수 있다.
      • ** 에러 해결 image.png
        implementation 'jakarta.persistence:jakarta.persistence-api:3.1.0'
        ⇒ build.gradle 의존성 추가 이렇게 바꿔줬는데도 테스트에서 오류가 나서
        ./gradlew clean --refresh-dependencies
        이 명령어 실행해주고 의존성 다시 리프레쉬 해주니까 해결 됐음.
      • PK 기반이 아닌 것들은 쿼리문 작성해줘야함 image.png
    • 스프링 데이터 JPA : 리포지토리에 구현 클래스 없이 인터페이스 만으로 개발을 완료할 수 있음. 그리고 반복 개발해온 기본 CRUD 기능도 스프링 데이터 JPA가 모두 제공함. image.png
  • 섹션8

    • AOP가 필요한 상황 모든 메소드의 호출 시간을 측정하고 싶다면?
      공통 관심 사항(cross-cutting concern) vs 핵심 관심 사항(core concern)
      회원 가입 시간, 회원 조회 시간을 측정하고 싶다면?
    • AOP 적용 image.png
    • 스프링의 AOP 동작 방식 설명 AOP 적용 전 의존 관계 image.png AOP 적용 후 의존 관계 image.png AOP 적용 전 전체 그림 image.png
  • 기타오류 해결 ( 블로그 참고! )

    잘 되던 이클립스가 맥북에서 실행되지 않을 때 'eclipse 응용 프로그램을 열 수 없습니다.'

profile
백엔드 개발자를 준비하는 삐약이 대학생에서 .. 취준생🐣

0개의 댓글