Preface
인프런에서 김영한님이 진행하시는 스프링 로드맵의 첫번째 강의 1회독을 마쳤다.
전체적인 내용에 대한 간단한 정리와 짤막한 후기를 작성해볼까 한다.
해당 강의는 아무래도 스프링 학습에 대한 전반적인 청사진 완성을 목표로 하는 강의이다보니 모든 개념에 대한 상세한 설명이 주가 된다기보단, 스프링과 스프링부트가 제공하는 다양한 기능을 코드를 통해 얕게라도 경험해보는 방식으로 진행된다.
자바 공부도 어느정도 했다고 생각하고 있었고, 스프링 관련 도서도 한 번 읽어본 뒤 시작한 공부지만, 강의를 들으며 중간중간 헷갈리는 개념들을 찾아보는 시간이 꽤나 오래 걸렸던 것 같다.
특히 강의 마지막 부분에서 소개하는 JDBCTemplate, JPA, Spring Data JPA 등은 개별적인 강의를 통해 학습할 생각으로 체념한 체 '이런 기술이 있구나..' 정도로만 이해하고 넘어갔다.
물론 중간중간 어려운 개념들이 있지만, 강의 자체는 목표를 충실히 지키며 진행된다.
무엇보다 로드맵이 있어 공부의 방향성을 잡을 수 있고, 강의 자체가 지루하지 않고 재미있다보니 뒷 부분의 유료 강의도 기대되는 것 같다.
기존 계획은 Spring MVC 1편 강의까지만 본 뒤 JPA 강의로 넘어가는 것이었는데 DB 2편 강의까지 구매하고싶어졌다.
글을 업로드한 후 강의를 배속으로 한 번 더 시청한 뒤 다음 강의로 넘어갈 생각이다.
- 과거엔 Maven 프로젝트를 생성했지만 최근엔 Gradle 프로젝트를 생성한다.
또한, 프로젝트 전체를 처음부터 생성하는 것이 아니라 스프링부트 기반의 프로젝트를 생성한다.
- 인텔리제이 설정에서 Build Tools -> Gradle의 usings를 인텔리제이로 설정해두면 서버가 더 빨리 작동된다.
- 현업에선 System.out.println( ) 대신 Logging 방식을 사용해 출력한다.
1) 로깅(Logging): 소프트웨어 개발 및 운영 과정에서 발생하는 이벤트, 상태, 오류 및 정보와 같은 중요한 정보를 기록하는 과정
→ 로그: 애플리케이션의 실행 중에 발생하는 다양한 사건을 기록하여, 애플리케이션의 동작 및 문제 해결에 도움을 준다.
2) 대표 라이브러리: SLF4J, logback
- 자동 import에서 static import를 하면 앞의 패키지 선언을 생략할 수 있다.
- 터미널에서 .jar 파일을 통해 스프링을 실행할 수 있다. (ctrl + c로 종료)
- Template Engine: HTML을 동적으로 실행시킬 수 있게 해줌
- 스프링 웹 실행 방식
1) 정적(static) 컨텐츠
2) MVC
3) API
- 웹 애플리케이션의 계층 구조
1) 컨트롤러: 웹 MVC의 컨트롤러 역할
2) 서비스: 핵심 비즈니스 로직 구현
3) 리포지토리: 데이터베이스에 접근, 도메인 객체를 DB에 저장하고 관리
4) 도메인: 비즈니스 도메인 객체, 예) 회원, 주문, 쿠폰 등등 주로 데이터베이스에 저장하고 관리됨
- Optional 클래스 타입에서 값을 꺼낼 떈 get() 메서드를 사용한다.
→ 출력값이 null일 가능성이 있으면 Optional로 감싸서 출력한다.
- Model: Spring Framework에서 웹 애플리케이션의 데이터를 저장하고 전달하는 데 사용되는 인터페이스
1) 주로 컨트롤러 메서드에서 뷰로 데이터를 전달하거나 뷰에서 컨트롤러로 데이터를 전달할 때 사용된다.
2) 키-값 쌍(key-value pair)으로 데이터를 저장하며, 뷰 템플릿에서 이 데이터를 사용할 수 있게 한다.
→ 컨트롤러에서 데이터를 Model에 추가하면, 이 데이터는 뷰로 전달되어 웹 페이지를 렌더링할 때 사용된다.
- 테스트
1) 테스트 클래스를 작성할 땐 @Test 어노테이션을 붙인다.
2) 테스트의 메서드 이름은 한글로 바꾸는 것이 좋다.
→ 테스트 코드는 빌드될 때 실제 코드에 포함되지 않는다.
3) 테스트는 given, when, then 주석을 사용하여 작성하는 것이 좋다.
- 테스트케이스 작성 방법
1. 동등 연산자를 이용해 boolean 타입으로 직접 출력해본다.
2. Assertions.assertEquals(x, y) 메서드를 이용해 비교한다. (Junit에서 제공)
3. Assertions.assertThat(x).isEqualTo(y) 메서드를 이용해 비교한다. (assertj.core에서 제공)
- 테스트케이스는 순서에 의존관계가 없도록 독립적으로 설계해야한다.
→ 한 클래스의 테스트가 완료될 때마다 저장소나 공용 데이터를 clear해줘야 한다.
@AfterEach: 각 테스트가 종료될 때 마다 호출
@BeforeEach: 각 테스트 실행 전에 호출
- 테스트 주도 개발(TDD): 테스트케이스를 먼저 설계한 후, 그에 맞게 소프트웨어를 개발하는 기법
- 스프링은 스프링 컨테이너에 스프링 빈을 등록할 때, 기본으로 싱글톤으로 등록하므로, 같은 스프링 빈이면 모두 같은 인스턴스다.
- 스프링 빈을 등록해두면 불필요한 객체 생성을 막을 수 있고, 스프링에서 제공하는 부가적인 기능들을 이용할 수도 있다.
- 생성자에 @Autowired를 사용하면 객체 생성 시점에 스프링 컨테이너에서 해당 스프링 빈을 찾아서 주입한다.
→ 생성자가 1개만 있으면 @Autowired는 생략할 수 있다.
- 스프링 빈과 의존 관계
1) 컴포넌트 스캔과 자동 의존관계 설정
- 스프링이 서버에 올라올 때 @Component 관련 어노테이션이 있으면 각각의 객체를 생성해서 스프링 컨테이너에 등록한다.
- Service, Repository, Controller 어노테이션은 Component 어노테이션을 지니고 있다.
- 기본 패키지와 하위 패키지만 컴포넌트 스캔을 한다.
2) 자바 코드로 직접 스프링 빈 등록하기
- 별도의 폴더(@Configiuration 어노테이션 필요)에 Service와 Repository Bean을 등록한다. 단, Service생성자에 Repository 객체를 주입한다. (Service, Repository 어노테이션은 없는 상태)
- Controller는 Spring이 관리하므로 자동으로 Component Scan된 후 @Autowired로 서비스 객체와 연결되도록 해야한다. (싱글톤이므로 컨트롤러 생성자에 넣는 서비스 객체는 빈에 등록된 객체와 동일한 인스턴스이다.)
- DI에는 필드 주입, setter 주입, 생성자 주입 이렇게 3가지 방법이 있다.
→ 의존관계가 실행중에 동적으로 변하는 경우는 거의 없으므로 생성자 주입을 권장된다.
- 컴포넌트 스캔 원리
1) @Component 애노테이션이 있으면 스프링 빈으로 자동 등록된다.
2) @Controller 컨트롤러가 스프링 빈으로 자동 등록된 이유도 컴포넌트 스캔 때문이다.
3) @Component 를 포함하는 애노테이션도 스프링 빈으로 자동 등록된다: @Controller, @Service, @Repository
- 실무에서는 주로 정형화된 컨트롤러, 서비스, 리포지토리 같은 코드는 컴포넌트 스캔을 사용하며, 정형화 되지 않거나, 상황에 따라 구현 클래스를 변경해야 하면 설정을 통해 스프링 빈으로 등록한다.
- @Autowired 를 통한 DI는 스프링이 관리하는 객체에서만 동작한다.
→ 스프링 빈으로 등록하지 않고 사용자가 직접 생성한 객체에서는 동작하지 않는다.
- 스프링부트는 먼저 스프링 컨테이너에서 관련 컨트롤러를 찾고, 없으면 static 파일을 찾는다.
→ 즉 static 파일보다 컨트롤러가 우선순위가 높다.
- @PostMapping: HTTP POST 요청을 처리하는 메서드를 정의할 때 사용
→ 보통 데이터를 등록할 땐 post, 조회할 땐 get을 사용한다.
- DataSource는 데이터베이스 커넥션을 획득할 때 사용하는 객체다.
→ 스프링 부트는 데이터베이스 커넥션 정보를 바탕으로 DataSource를 생성하고 스프링 빈으로 만들어두므로 DI를 받을 수 있다.
- 통합테스트를 할 땐 @SpringBootTest, @Transactional 어노테이션을 클래스에 붙인다.
1) @SpringBootTest: 스프링 컨테이너와 테스트를 함께 실행한다.
2) @Transactional: 테스트를 진행할 때 트렌잭션을 실행한 후, 테스트가 종료되면 rollback 작업을 실행한다.
→ 즉, 데이터 작업이 commit되지 않는다. (각각의 테스트마다 적용된다.)
- 테스트케이스에 붙었을 때만 해당 작업을 실행한다.
- 테스트케이스에 @Commit 어노테이션을 붙이면 테스트 후 commit까지 진행한다.
- 테스트를 실행할 땐 생성자를 통한 DI보단 필드를 통해 직접 DI를 실행하는 것이 편하다.
1) 실무에선 테스트 전용 DB를 생성해야 한다.
2) 테스트는 코드 수정 없이 반복해서 실행할 수 있어야 한다.
- 보통 순수 자바 코드를 사용한 작은 단위의 테스트를 단위 테스트, 스프링 컨테이너와 DB를 연동하서 진행하는 테스트를 통합 테스트라고 한다.
- H2 DB 접근 방법
1) 터미널에서 H2 디렉터리에 접근한다.
2) 권한을 준다: chmod 755 h2.sh
3) 실행한다: ./h2.sh
4) 최초 생성 이후엔 jdbc:h2:tcp://localhost/~/test 경로로 접속한다.
- 스프링 JdbcTemplate과 MyBatis 같은 라이브러리는 JDBC API에서 본 반복 코드를 대부분 제거해주지만, SQL은 직접 작성해야 한다.
- JPA는 기존의 반복 코드는 물론이고, 기본적인 SQL도 JPA가 직접 만들어서 실행해준다.
→ SQL과 데이터 중심의 설계에서 객체 중심의 설계로 패러다임을 전환을 할 수 있다.
- 스프링 데이터 JPA를 사용하면 리포지토리에 구현 클래스 없이 인터페이스 만으로 개발을 완료할 수 있다.
→ 기본 CRUD 기능도 스프링 데이터 JPA가 모두 제공한다.
- AOP를 적용하는 클래스엔 @Aspect을 붙여야 한다.
[무료] 스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술 - 인프런 | 강의
스프링 입문자가 예제를 만들어가면서 스프링 웹 애플리케이션 개발 전반을 빠르게 학습할 수 있습니다., 스프링 학습 첫 길잡이! 개발 공부의 길을 잃지 않도록 도와드립니다. 📣 확인해주세
www.inflearn.com
'Spring > 인프런 - 김영한(Spring 로드맵)' 카테고리의 다른 글
(인프런 - 김영한) 스프링 MVC 2편 후기 (0) | 2023.12.01 |
---|---|
(인프런 - 김영한) 스프링 MVC 1편 후기 (0) | 2023.11.10 |
HTTP 상태 코드 (0) | 2023.10.31 |
(인프런 - 김영한) HTTP 웹 기본 지식 후기 (2) | 2023.10.28 |
(인프런 - 김영한) 스프링 핵심 원리 기본편 후기 (2) | 2023.10.20 |
댓글