일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
- C언어
- @Component
- Nodejs
- AWS
- 구조체배열
- spring boot
- 해시
- 카카오 알고리즘
- 스프링
- 시스템호출
- Spring
- 가상면접사례로배우는대규모시스템설계기초
- 알고리즘
- TypeORM
- 컴포넌트스캔
- 파이썬
- C++
- @Autowired
- 코테
- nestJS
- nestjs auth
- python
- 프로그래머스
- OpenCV
- nestjs typeorm
- 카카오 코테
- 코딩테스트
- thymeleaf
- git
- 카카오
- Today
- Total
공부 기록장 💻
스프링 입문 - 코드로 배우는 스프링 부트 완강 후기와 학습 내용 정리 본문
스프링 입문 - 코드로 배우는 스프링 부트 완강 후기와 학습 내용 정리
dream_for 2023. 1. 18. 14:23
1월 초부터 인프런에서 우아한 형제들 개발 이사를 맡고 계시는 '김영한' 님의 스프링 입문 강의를 수강하기 시작하여, 약 2주(실제 7일)동안 학습을 진행하며 드디어 완강을 하게 되었다. 그동안 학습했던 내용을 되짚어보며 간단하게 복습하며 아래에 정리해보고자 한다.
1. 프로젝트 환경 설정 및 생성 을 통해 IntelliJ IDEA와 기본적인 Java SDK 를 설치하고, Spring Boot 프로젝트의 초기 설정을 하여 생성하였다.
- Gradle 의 의존성 라이브러리들과 디렉터리 구조 살펴보기를 통해 build.gradle에 spring boot 프로젝트 생성 시 추가한 라이브러리와 사용할 테스트 프레임워크, 내장 톰캣 서버와 thymeleaft 템플릿 엔진의 의존성 등을 확인해 보았다.
- View 환경 설정(Thymeleaf 템플릿 엔진) 을 통해서 웹 서버에 간단하게 View 를 띄워 보았다.static 정적 파일을 로컬 서버에 띄워 확인해 보았고, Thymeleaf 템플릿 엔진을 사용하여 controller에서 @GetMapping 을 통해 url을 매핑하고, model에 키-값 속성을 추가하고, 반환하는 String 값과 매칭되는 templates 디렉터리 내 html 파일을 thymeleaf 템플릿 문법을 기반으로 작성하여, 로컬 서버에 띄워 보았다.
- Gradle 빌드와 실행 을 통해서는 빌드, 컴파일, 링크의 개념을 다시 되짚어 보며, Java 프로젝트의 빌드 tool 인 Gradle의 특징과 Build Life Cycle 3단계에 대해 간단히 알아보았다. build.gradle 에서 설정하는 plugin, 저장소, 의존 관계, 테스팅 설정의 의존성들을 다시 한 번 자세하게 살펴보았다. 마지막으로 직접 Spring Boot 프로젝트를 터미널에서 빌드와 실행을 진행해보며, JAR 파일의 개념에 대해 다시 한 번 살펴보았다.
2. Spring Boot 정적 컨텐츠 기능 은 웹 개발 방식 3가지(정적 컨텐츠, MVC와 템플릿 엔진, API) 중 첫번째 방식이었다. 스프링 컨테이너가 내장 톰캣 서버를 통해 정적 파일을 띄우는지에 대한 원리를 살펴볼 수 있었다.
3. 다음으로 MVC와 템플릿 엔진을 이용한 웹 개발 방식에 대해 배웠다. Model, View, Controller 구조로 웹을 개발하는 MVC 패턴과 분리된 각각의 역할, 그리고 MVC를 이용한 웹 개발의 동작 방식 대해 알아보았다. @GetMapping을 통한 url 매핑, 메서드의 @RequestParam 인자를 통한 경로 파라미터 설정을 해보았다.
4. 마지막으로 HTTP 기반 REST API 를 이용한 웹 개발 방식을 배웠다. @ResponseBody 를 통해 클래스의 객체를 반환하여 json 형식으로 데이터를 전달하는 예제를 진행하였다. HttpMessageConverter 를 통한 스프링 컨테이너 내에서의 @ResponseBody 의 동작 원리 또한 살펴보았다.
5. 이후 회원을 등록하고 회원 목록을 조회하는 간단한 회원 관리 프로그램의 백엔드를 개발하는 과정을 배웠다.
- 우선 비즈니스의 요구사항을 정리하고, 회원의 Domain과 Repository를 생성하여 간단한 Test Case를 작성해보았다. 웹 어플리케이션의 기본적인 Domain과 Controller-Service-Repository 구조를에 대해 살펴보고, Repository 인터페이스와 구현체를 구현하였다. 아직 DB 저장소가 선정되지 않았다는 가정하에, Repository를 인터페이스로 만들고, DB 저장소를 어떤 것으로 설정하느냐에 따라 구현 클래스로 변경을 하는 추상화를 진행하였다. 회원의 기본적인 속성을 설명하는 Member 도메인을 만들고, 내부 메모리를 사용하여 회원 정보를 저장하고, id와 name 을 통해 회원을 조회하고, 모든 회원 정보를 반환하는 메서드를 Repository에 추가하였다. 마지막으로 JUnit 프레임워크를 이용해, 회원 Repository의 각 메서드에 대한 Test Case를 작성해보았다. 테스트 메서드들이 서로 영향을 주지 않고 독립적으로 실행될 수 있도록, @AfterEach 어노테이션을 사용해 메모리를 초기화해주는 메서드를 추가하였다.
- 이후, 단순히 DB에 접근하여 데이터를 저장하고 꺼내는 역할을 하는 Repository와 다르게, 구체적인 비즈니스 로직을 담당하는 회원 서비스 개발 및 테스트, 그리고 서비스와 레포지터리의 의존 관계를 주입 하는 과정을 거쳤다. Given-When-Then 패턴을 통해 테스트 케이스의 코드를 표현하는 방법에 대해 학습을 할 수 있었다. 그리고 하나의 Service가 하나의 Repository를 사용할 수 있도록, 서비스에 Repository 의존성을 주입하는 DI 과정을 진행하였다. 이후 각 테스트가 진행될 때마다 하나의 Repository 가 주입된 새로운 Service 객체가 생성되도록 @BeforeEach 메서드를 작성하였다.
6. 스프링 컨테이너에 의해 관리되는 자바 객체인 스프링 빈과 의존 관계(컴포넌트 스캔, 자바 코드로 직접 bean 등록) 를 학습하였다. @Controller, @Service, @Repository 어노테이션을 추가하여 spring bean으로 등록하고 생성자에 @Autowired 어노테이션을 붙임으로써 DI를 진행하였다. 상황에 따라 구현 클래스를 변경해야 하는 경우, @Configuration과 @Bean 직접 작성을 통해 스프링 빈 등록을 진행한다.
7. 이후 본격적으로 웹 MVC를 이용해 회원 관리 예제 개발을 학습하였다. 홈 화면과 회원 가입 및 회원 목록 페이지를 추가하였다. @Controller에서 회원 가입 페이지의 경로에 대하여 @GetMapping, @PostMapping을 통해 페이지를 띄우고 새로운 회원을 등록하도록 작성하였고, 회원 목록 페이지에서는 @GetMapping을 통해 각 회원의 정보를 보여주는 페이지를 띄울 수 있도록 작성하였다.
8. 스프링 DB 접근 기술에 대해 학습하였다. 기존에 자바 내부 메모리를 사용해 Map 을 통해 members 객체들을 저장한 것과 달리, H2 데이터베이스를 이용해 DB 에 접근하는 여러 기술에 대해 학습하였다.
- H2 데이터베이스를 설치 및 연결하고, 순수 JDBC API를 이용한 DB 접근 기술에 대해 학습하였다. 용량이 가벼워 개발용 로컬 DBMS로 사용하기 좋은 H2 데이터베이스를 설치하고, DB와 연결하기 위한 다양한 설정을 진행한 후, 순수 JDBC API를 이용하기 위한 JDBC 리포지터리를 구현하였다. Configuration 에서 서비스에 주입할 Repository 인터페이스의 구현체를 해당 JDBC Repository 구현체로 설정하는 DI 과정을 진행하며, OCP(개방-폐쇄 원칙)을 이해할 수 있었다.
- 스프링 통합 테스트에 학습하며 스프링 컨테이너와 DB까지 모두 연결한 테스트를 진행했다. 테스트를 진행할 클래스에는 @SpringBootTest와 rollback을 수행하여 각 메서드가 독립적으로 실행되도록 하는 @Transactional을, 그리고 각 test case에서 사용할 service, repository 에는 @Autowired 어노테이션을 추가하였다.
- JdbcTemplate을 이용한 DB 접근 기술에 대해 학습하며, JDBC API를 보다 간단하게 사용할 수 있는 JdbcTemplatce을 통한 구현을 진행하였다, RowMapper 인터페이스를 구현하여 쿼리문 결과로 얻은 Result set을 매핑하였다.
- JPA을 이용한 DB 접근기술에 대해 학습하였다. sql문을 작성해야 했던 JDBC, JdbcTemplate과 다르게 sql문을 작성하지 않고, 프레임워크에서 제공하는 API와 간단한 쿼리 스트링을 이용해 구현을 하였다.
- Spring Data JPA 를 이용한 DB 접근 기술을 통해서는, repository 구현체를 작성하지 않고도, JpaRepository 인터페이스 확장만을 통해 비즈니스 로직에만 집중하며 interface만으로도 개발을 하는 방법에 대해 학습하였다
9. AOP의 개념과 필요성, 예제 실습을 통해 어떠한 로직에 대하여 공통 관심 사항을 핵심 관심 사항으로부터 분리하는 AOP를 적용하는 과정을 학습하며 로직의 핵심 관심 사항을 깔끔하게 유지하며 객체 지향적인 관점의 설계를 조금 더 이해할 수 있었다.