Ian's Archive 🏃🏻

Profile

Ian

Ian's Archive

Developer / React, SpringBoot ...

📍 Korea
Github Profile →
Categories
All PostsAlgorithm19Book1C1CI/CD2Cloud3DB1DesignPattern9ELK4Engineering1Front3Gatsby2Git2IDE1JAVA7JPA5Java1Linux8Nginx1PHP2Python1React9Security4SpatialData1Spring26
thumbnail

스프링 입문 강의 정리 - 김영한

Spring
2022.02.02.

Series

  • 1스프링 입문 강의 정리 - 김영한
  • 2스프링 핵심 원리 강의 정리 - 김영한
  • 3스프링 MVC 1 강의 정리 - 김영한
  • 4스프링 MVC 2 강의 정리 - 김영한

Spring

Maven / Gradle - 프로젝트 의존성 관리 도구

Controller에서 리턴 값으로 문자를 반환 시 viewResolver 화면을 찾아서 처리한다.

resources:templates/ +{ViewName}+ .html
해당 경로를 기본적으로 읽는다.

build

복사
1. .gradlew build
2. cd build/libs
3. jar파일 실행

API

@RequestBody 어노테이션 사용

  • viewResolver 대신 HttpMessageConverter 동작
  • 기본 문자 처리 : StringHttpMessageConverter
  • 기본 객체 처리 : MappingJackson2HttpMessageConverter
    ++ 응답을 위한 여러 HttpMessageConverter가 포함되어 있다.
  1. HTTP Header
  2. 서버의 반환 정보 => HttpMessageConverter가 선택된다.

일반적인 웹 어플리케이션 구조

복사
컨트롤러 -> 서비스 -> 레포지토리 -> db
            도메인

Controller : MVC 컨트롤러
Service : 비즈니스 로직
Repository : DB접근, 도메인 객체 저장 및 관리
Domain : 비즈니스 도메인 객체

테스트 케이스 작성

Junit

DI(의존성 주입)

Service에서 직접 객체를 선언해 사용하지 않고 외부에서 객체를 만들어 전달해 사용

  • 컴포넌트 스캔과 자동 의존관계 설정 -> 스프링 부트 어노테이션
    ex) Controller, Repository, Service, Autowired
@Autowired를 통한 DI는 helloConroller , memberService 등과 같이
스프링이 관리하는 객체에서만 동작한다.
  • Bean객체는 Singleton으로 관리
  • DI에는 필드 주입, setter 주입(수정자를 통한 주입), 생성자 주입 3가지 방법
    (의존관계가 실행중에 동적으로 변하는 경우는 거의 없으므로 생성자 주입을 권장한다.)
  • 정형화 되지 않거나, 상황에 따라 구현 클래스 변경하는 경우 설정(@Configuration)을 통해 스프링 빈 등록

생성자 주입

복사
@Controller
public class MemberController {
    private final MemberService memberService;

    @Autowired
    public MemberController(MemberService memberService) {
        this.memberService = memberService;
    }
}

생성자 주입의 장점

  • 의존관계 설정이 되지 않으면 객체 생성 불가
    -> 컴파일 타임에 인지 가능, NPE(Null Point Exception) 방지
  • 필드 final 변수로 사용
    -> 런타임에 객체 불변성 보장
  • 테스트 코드작성 용이
    -> 스프링에서 순환참조 확인가능

H2

h2 설치 하면 처음엔 파일을 읽는데 서버로 읽게 경로를 수정해준다.
jdbc:h2:tcp://localhost/~/test

Test

  • Test 코드 작성 시, 편의에 따라 필드주입 사용 (의존관계가 별로 중요하지 않을 경우)
  • @Transaction : DB Transaction을 시작하고 롤백해줘서 DB에 영향을 주지 않는다.
  • @SpringBootTest : Spring Container, Test 함께 실행

스프링 DB 접근 기술

1. 순수 Jdpc

2. JdbcTemplate

  • 순수 Jdpc를 Template Method패턴으로 반복코드 제거 (sql은 직접 작성)

3. JPA

  • 반복 코드 제거 (SQL까지) -> 개발 생산성 향상
  • SQL과 데이터 중심의 설계 -> 객체 중심의 설계로 패러다임을 전환

사용

  • dependency, application.properties 추가

application.properties

복사
show-sql : JPA가 생성하는 SQL을 출력한다.
ddl-auto : 테이블을 자동으로 생성하는 기능 제공
-> none / create(entity정보를 바탕으로 테이블 생성)

AOP(Aspect Oriented Programming)

  • 특정 로직을 공통적으로 적용해야 하는 경우
    ex) 시간 체크
  • 공통 관심 사항 vs 핵심 관심 사항 분리

Tip!!

IntelliJ

  • Preferences - gradle 에서 Build and run 옵션 Intellij로 변경하면 빨라진다.

Spring

  1. null 반환 대신 Optional로 감싸서 반환해라
    -> 클라이언트에서 해당 값 사용,
    -> Optional 함수 사용 가능 // ifPresent

  2. 동시성 문제 때문에 long, map 대신 다른 변수 사용한다.

  3. Test 전체 실행 시, 순서 보장이 안된다.
    -> Test case를 작성 시 순서에 영향 받지 않아야 한다.
    -> @AfterEach, @BeforeEach : Test가 끝날 때 마다 실행시켜주는 Call back method

  4. Service naming -> 비즈니스 로직에 맞게
    Repository naming -> 조금 더 개발자스럽게

  5. HashMap 대신 실무에서는 동시성 문제가 고려해 ConcurrentHashMap, AtomicLong 사용 고려

문제 상황 해결

애플리 케이션을 실행시켜 주면 중간에 이상한 로그들이 보였는데

spring-boot-starter로 프로젝트는 dependency들을 해결하기 위해 많은 class를 가지고 있으며,
이를 자동으로 해결해 주는 것을 autoconfiguration이라고 한다.

starter에서 classpath내의 class들을 훑으며 프로젝트에 필요한 클래스 등을 판별하는데,
프로젝트에 필요한 클래스라면 matched를, 프로젝트에 필요 없는 클래스라면 did not match
알려주는 로그
(문제 x)

Previous Post
Location 객체 정리
Next Post
스프링 핵심 원리 강의 정리 - 김영한
Thank You for Visiting My Blog, I hope you have an amazing day 😆
© 2023 Ian, Powered By Gatsby.