08 Feb 2022
|
TIL
학습과정
1. 자바
Chapter 2. 동작 파라미터화 코드 전달하기 부분을 공부했다.
- 전략 디자인 패턴(strategy design pattern)
- 동작 파라미터화
- 익명 클래스(anoymous class)
- 람다 표현식 사용
람다 표현식을 잘 사용하면 코딩 테스트를 볼 때 코드를 간단하고 보기 좋게 작성할 수 있을 것 같다. 내일 공부하게 될 람다 표현식을 잘 정리해놔야 겠다.
2. 스프링
Chapter 2. 웹 애플리케이션 개발하기 부분을 공부했다.
타코 클라우드에 식자재를 보여주는 팔레트를 사용해 고객이 커스텀 타코를 디자인하는 기능과 고객의 정보를 입력받아 유효성 검증을 진행하는 기능까지 만들었다.
- Lombok: Lombok 애노테이션을 코드에 추가하면 컴파일 시에 빌드 명세에 정의한 Lombok이 실행됨
- GET 요청 처리하기 - 스프링 MVC에서 사용할 수 있는 요청-대응 애노테이션
- Thymeleaf 템플릿
- 빈 유효성 검사(Bean Validation) API, Hibernate 컴포넌트
- 뷰 컨트롤러 - WebMvcConfigurer 인터페이스
- 뷰 템플릿 라이브러리 - FreeMarker, Groovy, JavaServer Pages(JSP), Mustache, Thymeleaf
- 템플릿 캐싱
3
스프링 공부를 마무리하고 알고리즘 문제를 풀고있던 도중 현대 IT&E 채용 확정형 교육생 선정 결과 불합격이라는 문자를 받았다.
불합격 문자를 받은 뒤 알고리즘 문제에 집중해 보려고 했으나 집중이 되지 않아 평소보다 이른 시간에 공부를 마무리했다. 내일은 오늘 풀지 못한 알고리즘 문제까지 풀어야겠다.
07 Feb 2022
|
스프링 인 액션 (제5판)
Spring
1. 스프링이란?
- 대부분의 애플리케이션은 애플리케이션 전체 기능 중 일부를 담당하는 많은 컴포넌트로 구성됨
- 각 컴포넌트는 다른 애플리케이션 구서 요소와 협력해 작업을 처리
- 애플리케이션이 실행될 때는 각 컴포넌트가 어떻게든 생성되어야 하고 상호 간에 알 수 있어야 함
- 스프링은 스프링 애플리케이션 컨텍스트(Spring application context)라는 컨테이너(container)를 제공
- 이 컨테이너는 컴포넌트들을 생성하고 관리
- 애플리케이션 컴포넌트 또는 빈(bean)들은 스프링 애플리케이션 컨텍스트 내부에서 서로 연결되어 완전한 애플리케이션을 만듦
- 빈의 상호 연결은 의존성 주입(Dependency Injection, DI)라고 알려진 패턴을 기반으로 수행됨
- 애플리케이션 컴포넌트에서 의존(사용)하는 다른 빈의 생성과 관리를 자체적으로 하는 대신 별도의 개체(컨테이너)가 해줌
- 이 개체에서는 모든 컴포넌트를 생성, 관리하고 해당 컴포넌트를 필요로 하는 빈에 주입(연결)함. 일반적으로 생성자 인자 또는 속성의 접근자 메서드를 통해 처리됨
-
핵심 컨테이너 외에도 스프링과 관련 라이브러리에서는 웹 프레임워크, 다양한 데이터 저장 옵션, 보안 프레임워크, 타 시스템과의 통합, 런타임 모니터링, 마이크로서비스 지원, 리액티브 프로그래밍 모델, 최신 애플리케이션 개발에 필요한 많은 다른 기능을 제공
-
최신 버전의 스프링에서는 자바 기반의 구성(configuration)이 더 많이 사용됨
@Congiguration
public class ServiceConfiguration {
@Bean
public InventoryService inventoryService() {
return new InventoryService();
}
@Bean
public ProductService productServicd() {
return new ProductSercive(inventoryService());
}
}
@Configure 애노테이션은 각 빈을 스프링 애플리케이션 컨텍스트에 제공하는 구성 클래스라는 것을 스프링에게 알려줌
- 구성 클래스의 메서드에는
@Bean 애노테이션이 지정되어 있으며, 각 메서드에서 반환되는 객체가 애플리케이션 컨텍스트의 빈으로 추가되어야 한다는 것을 나타냄
- 각 빈의 ID가 해당 빈을 정의하는 메서드의 이름과 동일
애노테이션(annotation)
- 클래스, 인터페이스, 함수, 매개변수, 속성, 생성자에 어떤 의미를 추가할 수 있는 기능
- 자바 컴파일러가 컴파일 시에 처리
- 소스 코드에 추가된 애노테이션 자체는 바이트 코드로 생성되지 않고 주석으로 처리되지만, 애노테이션이 갖는 의미대로 컴파일러가 작업을 수행해줌
- XML 기반 구성에 비해 자바 기반 구성은 더 강화된 타입 안전과 향상된 리팩토링 기능을 포함해 몇 가지 장점을 제공
-
스프링은 자동으로 컴포넌트들을 구성할 수 있는 자동-구성 기능이 있어 별도의 XML 구성이나 자바 구성이 없어도 됨. 따라서 자동-구성을 할 수 없을 경우에만 필요
- 자동-구성은 자동 연결(autowiring)과 컴포넌트 검색(component scanning) 이라는 스프링 기법을 기반으로 함
- 컴포넌트 검색을 사용하여 자동으로 애플리케이션의 classpath에 지정된 컴포넌트를 찾은 후 스프링 애플리케이션 컨텍스트의 빈으로 생성할 수 있음
- 스프링은 자동 연결을 사용하여 의존 관계가 있는 컴포넌트를 자동으로 다른 빈에 주입(연결)함
- 스프링 부트가 소개되면서 자동-구성 기능이 더욱 향상됨
- 스프링 부트는 생산성 향상을 제공하는 스프링 프레임워크의 확장
- 향상된 자동-구성(autoconfiguration) 기능에 의해 환경 변수인 classpath를 기준으로 어떤 컴포넌트가 구성되고 연결되어야 하는지 알 수 있음
2. 스프링 애플리케이션 초기 설정하기
- 타코를 주문하는 타코 클라우드 온라인 애플리케이션을 생성할 것
- 스프링 Initializr(이니셜라이저)를 사용해 애플리케이션을 초기 설정할 것
스프링 Initializr(이니셜라이저)
- REST API를 사용하는 브라우저 기반의 웹 애플리케이션
- 원하는 긴으을 구현할 수 있는 스프링 프로젝트의 구조를 생성해줌
- 스프링 Initializr를 사용하는 여러 방법이 있지만 이 책에서는 Spring Tool Suite(STS)의 스프링 Initializr 지원 기능을 사용
- STS는 이클립스를 기반으로 하는 스프링 IDE. 다른 IDE에는 없는 스프링 부트 대시보드(Spring Boot Dashboard) 기능도 제공
STS를 사용해서 스프링 프로젝트 초기 설정하기
- Packaging에서는 WAR(Web application ARchive)가 아닌 실행 가능한 JAR(Java ARchive) 파일을 선택
- 기존의 자바 웹 애플리케이션은 WAR 파일로 패키징되며, JAR 파일은 라이브러리와 데스크톱 UI 애플리케이션의 패키징에 사용
- JAR 패키징은 클라우드를 염두에 둔 선택. WAR 파일은 기존의 자바 애플리케이션 서버에 애플리케이션을 배포할 때는 적합하지만, 대부분의 클라우드 플랫폼에는 잘 맞지 않음
- 일부 클라우드 플랫폼에서는 WAR 파일을 배포하고 실행할 수 있지만, 모든 자바 클라우드 플랫폼은 실행 가능한 JAR 파일을 사용
- 만일 기존의 자바 애플리케이션 서버에 애플리케이션을 배포하고자 한다면 WAR 패키징을 선택하고 웹 초기 설정 클래스를 포함시켜야 함
- 프로젝트에 추가할 의존성(dependency) 지정 가능
- 의존성에는 프로젝트의 애플리케이션에서 사용하는 외부 라이브러리 모듈을 저정
- 여러 컴포넌트 클래스가 포함된 jar 파일이 주로 사용됨
스프링 프로젝트 구조 살펴보기
src/main/java: 애플리케이션 소스 코드
src/main/test: 애플리케이션 테스트 코드
src/main/resources: 자바 리소스가 아닌 것
프로젝트 구조에서 알아 둘 주요 항목
mvnw와 mvnw.cmd: 메이븐 래퍼 스크립트. 메이븐이 각자 컴퓨터에 설치되어 있지 않더라도 이 스크립트를 사용해 프로젝트를 빌드할 수 있음
pom.xml: 메이븐 빌드 명세(프로젝트 빌드 시 필요한 정보)를 지정한 파일
TacoCloudApplication.java: 스프링 부트 메인 클래스
application.properties: 처음에는 이 파일의 내용이 없음. 구성 속성 지정할 수 있음
static: 브라우저에 제공할 정적인 콘텐츠(이미지, 스타일시트, 자바스크립트 등)를 저장할 수 있는 폴더. 처음에는 비어있음.
templates: 브라우저에 콘텐츠를 보여주는 템플릿 파일을 두는 폴더. 처음에는 비어있지만, 조만간 Thymeleaf 템플릿을 추가할 것
TacoCloudApplicationTests.java: 스프링 애플리케이션이 성공적으로 로드되는지 확인하는 간단한 테스트 클래스
빌드 명세 살펴보기 (pom.xml)
- Initializr 폼에서 프로젝트가 메이븐으로 빌드된다는 것을 지정함. 따라서 스프링 Initializr는 지정한 내용들을 갖는
pom.xml 파일을 생성
<parent> 요소의 <version>: 프로젝트가 부모 POM(Project Object Model) 으로 spring-boot-starter-parent를 갖는다는 것을 지정
- 이 부모 POM은 스프링 프로젝트에 흔히 사용되는 여러 라이브러리의 의존성 관리를 제공하므로 이런 라이브러리들의 경우 버전을 지정할 필요가 없음
- 스프링 부트 버전에 의해 정의된 의존성 관리를 계승
<dependencies>: 의존성 정의
- STS의 프로젝트 위저드에서 선택한 각 의존성이
<dependencies> 요소로 지정됨
- Spring Web, Thymeleaf, Spring Boot DevTools, Lombok은 우리가 선택한 것. spring-boot-stater-test는 테스트를 작성할 것에 대비해 스프링 Initializr가 자동으로 추가해줌
- Spring Web, Thymeleaf, Test 의존성 항목은
<artifactId>에 starter 단어를 포함. 스프링 부트 스타터 의존성을 나타냄. 이 의존성 항목들은 자체적으로 라이브러리 코드를 갖지 않고 다른 라이브러리의 것을 사용
- 스타터 의존성의 세 가지 장점
- 필요로 하는 모든 라이브러리의 의존성을 선언하지 않아도 되므로 빌드 파일이 훨씬 더 작아지고 관리하기 쉬워짐
- 라이브러리 이름이 아닌 기능의 관점으로 의존성을 생각할 수 있음. 만일 웹 애플리케이션을 개발한다면 웹 애플리케이션을 작성할 수 있게 해주는 라이브러리들을 일일이 지정하는 대신 웹 스타터 의존성만 추가하면 됨
- 라이브러리들의 버전을 걱정하기 않아도 됨. 스프링 부트에 포함되는 라이브러리들의 버전은 호환이 보장되므로 사용하려는 스프링 부트의 버전만 신경 쓰면 됨
pom.xml 파일 마지막에는 스프링 부트 플러그인이 지정됨. 플러그인의 중요 기능은
- 메이븐을 사용하는 애플리케이션을 실행할 수 있게 해줌
- 의존성에 지정된 모든 라이브러리가 실행 가능 JAR 파일에 포함되어 있는지, 런타임 시에 classpath에서 찾을 수 있는지 확인
- 실행 가능 JAR 파일의 메인 클래스로 부트스트랩 클래스를 나타내는 매니페스트 파일을 JAR 파일에 생성함
애플리케이션의 부트스트랩(구동)
-
실행 가능 JAR 파일에서 애플리케이션을 실행하므로 제일 먼저 시작되는 부트스트랩 클래스가 있어야 함. 또한, 애플리케이션을 부트스트랩하기 위한 최소한의 스프링 구성도 있어야 함
-
부트스트랩 클래스인 TavoCloudApplication의 내용은 아래와 같음
package tacos;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class TacoCloudApplication {
public static void main(String[] args) {
SpringApplication.run(TacoCloudApplication.class, args);
}
}
@SpringBootApplication: 이 코드가 스프링 부트 애플리케이션임을 나타냄. 아래 세 개의 애노테이션이 결합한 것
@SpringBootConfiguration: 현재 클래스를 구성 클래스로 지정. 필요하다면 자바 기반의 스프링 프레임워크 구성을 현재 클래스에 추가할 수 있음
@EnableAutoConfiguration: 스프링 부트 자동-구성을 활성화. 필요로 하는 컴포넌트들을 자동으로 구성하도록 스프링 부트에 알려줌
@ComponentScan: 컴포넌트 검색을 활성화함. 스프링은 자동으로 클래스를 찾아 스프링 애플리케이션 컨텍스트에 컴포넌트로 등록
main() 메서드
- JAR 파일이 실행될 때 호출되어 실행되는 메서드
- 실제로 애플리케이션을 시작시키고 스프링 애플리케이션 컨텍스트를 생성하는 SpringApplication 클래스의
run() 메서드를 호출
run() 메서드에 전달되는 두 개의 매개변수는 구성 클래스와 명령행 인자
애플리케이션 테스트하기
3. 스프링 애플리케이션 작성하기
- 타코 클라우드 애플리케이션에 추가할 첫 번째 기능은 홈페이지(hompage)이며, 다음의 두 가지 코드를 생성
- 홈페이지의 웹 요청(request)을 처리하는 컨트롤러(controller) 클래스
- 홈페이지의 모습을 정의하는 뷰 템플릿
- 홈페이지를 테스트하는 간단한 테스트 클래스도 작성할 것
웹 요청 처리하기
- 스프링은 스프링 MVC라고 하는 강력한 웹 프레임워크를 가짐
- 스프링 MVC의 중심에 컨트롤러가 있으며, 컨트롤러는 웹 요청과 응답을 처리하는 컴포넌트(또는 구성 요소)
- 웹 브라우저를 상대하는 애플리케이션의 경우 컨트롤러는 선택적으로 모델 데이터를 채워 응답하며, 브라우저에 반환되는 HTML을 생성하기 위해 해당 응답의 웹 요청을 뷰에 전달
- 스프링 MVC에 관한 자세한 내용은 2장에서 다룰 것
간단한 컨트롤러 클래스 작성
- 루트 경로의 웹 요청을 처리한 후 모델 데이터를 채우지 않고 해당 웹 요청을 홈페이지 뷰에 전달하는 간단한 컨트롤러 클래스 작성
package tacos;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
@Controller
public class HomeController {
@GetMapping("/")
public String home() {
return "home";
}
}
- HomeController 클래스는
@Controller 애노테이션이 지정되어 있음
@Controller 는 컴포넌트 검색 시에 HomeController 클래스가 컴포넌트로 식별되게 하는 것이 주 목적
- 스프링의 컴포넌트 검색에서는 자동으로 HomeController 클래스를 찾은 후 스프링 애플리케이션 컨텍스트의 빈으로 HomeController의 인스턴스를 생성
@Component, @Service, @Repository를 포함해 소수의 다른 애노테이션들도 @Controller와 동일한 기능을 제공하므로 이런 애노테이션들 중 어느 것을 사용해도 됨
@Controller을 사용한 이유는 애플리케이션에서의 컴포넌트 역할을 더 잘 설명해주기 때문
home() 메서드는 @GetMapping 애노테이션으로 지정되어 있음
- 루트 경로의 /의 HTTP GET 요청이 수신되면 이 메서드가 해당 요청을 처리해야 함
- 이 코드에서는 home 값을 갖는 String만 반환하고 다른 일은 하지 않음
- 이 값은 뷰의 논리적인 이름
- 뷰는 여러 방법으로 구현 가능하지만, Thymeleaf가 classpath에 지정되어 있으므로 여기서는 Thymeleaf를 사용해 뷰 템플릿을 정의할 수 있음
왜 Thymeleaf를 사용할까?
- JSP를 스프링 부트와 같이 사용할 때는 몇 가지 고려할 것이 있기 때문 (2장에서 자세히 다룸)
- 논리적인 뷰 이름(여기서는 home) 앞에 /templates/가 붙고 끝에는 .html이 추가된 것이 템플릿 경로와 파일 이름이 됨
- 여기서는 /templates/home.html
- 이 프로젝트에서는 /src/main/resources/templates/home.html로 템플릿이 저장되어야 함
뷰 정의하기
- 타코 클라우드 홈페이지를 정의하는 기본적인 Thymeleaf 템플릿
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml"
xmlns:th="http://www.thymeleaf.org">
<head>
<meta charset="EUC-KR">
<title>Taco Cloud</title>
</head>
<body>
<h1>Welcome to...</h1>
<img th:src="@{/images/TacoCloud.png}"/>
</body>
</html>
<img> 태그: 컨텍스트의 상대적인 경로에 위치하는 이미지를 참조하는 @{...} 표현식을 사용해 Thymeleaf의 th:src 속성을 지정
- 홈페이지의 웹 요청을 처리하는 컨트롤러와 홈페이지를 보여주는 뷰 템플릿을 갖게됨
컨트롤러 테스트하기
- HTML 페이지의 콘텐츠에 대한 어서션(assertion, 원하는 것이 맞는지 테스트하기 위해 지정한 단언)을 설정하기 어렵기 때문에 웹 애플리케이션의 테스트는 까다로울 수 있음
- 스프링은 웹 애플리케이션을 쉽게 테스트하는 테스트 지원 기능을 제공
- 홈페이지에 적합한 테스트를 작성할 것
- 루트 경로인 /의 HTTP GET 요청을 수행한 후 성공적인지, 뷰 이름이 home이고 ‘Welcome to…’ 메시지가 포함된 결과가 기대한 대로 나오는지 테스트
package tacos;
import static org.hamcrest.Matchers.containsString;
import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get;
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.content;
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status;
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.view;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.autoconfigure.web.servlet.WebMvcTest;
import org.springframework.test.web.servlet.MockMvc;
@WebMvcTest(HomeController.class)
public class HomeControllerTest {
@Autowired
private MockMvc mockMvc;
@Test
public void testHomePage() throws Exception{
mockMvc.perform(get("/")).andExpect(status().isOk()).andExpect(view().name("home")).andExpect(content().string(containsString("Welcome to...")));
}
}
- HomeControllerTest는
@StringBootTest 대신 @WebMvcTest 애노테이션을 사용
- 스프링 부트에서 제공하는 특별한 애노테이션
- 스프링 MVC 애플리케이션의 형태로 테스트가 실행되도록 함
- 즉, HomeController가 스프링 MVC에 등록되므로 스프링 MVC에 웹 요청을 보낼 수 있음
@WebMvcTest는 스프링 MVC를 테스트하기 위한 스프링 지원을 설정
- 이 테스트에서는 실제 서버를 시작하는 대신 스프링 MVC의 모의(mocking) 매커니즘을 사용해도 충분하므로 모의 테스트를 하기 위해 테스트 클래스에 MockMvc 객체를 주입(연결)
testHomePage() 메서드
- 홈페이지에 대해 수행하고자 하는 테스트를 정의
- 루트 경로인 /의 HTTP GET 요청을 MockMvc 객체로 수행
- 기대하는 것(expection)을 다음과 같이 설정
- 응답은 반드시 HTTP 200 (OK) 상태가 되어야 함
- 뷰의 이름은 반드시 home이어야 함
- 브라우저에 보이는 뷰에는 반드시 ‘Welcome to…’ 텍스트가 포함되어야 함
- MockMvc 객체가 루트 경로인 /의 HTTP GET 요청을 수행한 수, 세 가지 중 어느 하나라도 충족하지 않으면 테스트는 실패
- Run 툴바의 JUnit Test 선택해 테스트 실행
- 테스트 결과는 패키지 탐색기 창의 탭으로 나타남
- 테스트가 에러 없이 정상적으로 수행됨
애플리케이션 빌드하고 실행하기
- 스프링 부트 대시보드는 IDE 창의 왼쪽 아래에 탭으로 나타남
- 애플리캐이션이 시작되면 작업 진행을 나타내는 로그 항목들이 콘솔에 나타남
- 그 중 톰캣 애플리케이션 서버를 자동으로 시작시키는 Tomcat started on port(s):8080 (http)라는 로그 항목도 있음
- 이처럼 작업이 진행되면 만든 홈페이지를 웹 브라우저에서 볼 수 있음
- 톰캣에 애플리케이션을 설치하지 않았는데도 실행 가능한 이유
- 스프링 부트 애플리케이션에는 실행에 필요한 모든 것이 포함되기 때문에 톰캣과 같은 애플리케이션 서버에 별도로 애플리케이션을 설치할 필요가 없음
- 개발 시점의 편리한 도구를 제공
- 코드가 변경될 대 자동으로 애플리케이션을 다시 시작
- 브라우저로 전송되는 리소스(템플릿, 자바스크립트, 스타일시트…)가 변경될 때 자동으로 브라우저를 새로고침함
- 템플릿 캐시를 자동으로 비활성화
- 만일 H2 데이터베이스가 사용 중이라면 자동으로 H2 콘솔을 활성화
- DevTools는 각종 IDE의 플러그인이 아니며, 특정 IDE를 사용해야 하는 것도 아님
- 개발 시에만 사용되도록 했으므로 실제 운영에서는 스스로 비활성화 됨
자동으로 애플리케이션 다시 시작시키기
- DevTools는 변경을 감시하며, 뭔가 변경되었음을 알게 되면 자동으로 애플리케이션을 다시 시작시킴
- DevTools를 사용 중일 때 애플리케이션은 JVM에서 두 개의 클래스 로더에 의해 로드됨
- 하나는 자바 코드, 속성 파일, 프로젝트의 src/main 경로에 있는 모든 것과 함께 로드되고 이것은 자주 변경될 수 있는 것
- 나머지 클래스 로더는 자주 변경되지 않는 의존성 라이브러리와 함께 로드됨
- 변경이 감지되는 경우 DevTools는 프로젝트 코드를 포함하는 클래스 로더만 다시 로드하고 스프링 애플리케이션 컨텍스트를 다시 시작시킴
- 다른 클래스 로더와 JVM은 그대로 둬 애플리케이션이 시작하는데 걸리는 시간을 단축해줌
- 단점: 애플리케이션이 자동으로 다시 시작될 때 의존성 변경이 적용될 수 없음
- 의존성 라이브러리르 포함하는 클래스 로더는 자동으로 다시 로드되지 않기 때문
- 빌드 명세에 의존성을 추가, 변경, 삭제할 때는 애플리케이션을 새로 시작해야만 변경의 효과가 나타날 수 있음
자동으로 브라우저를 새로고침하고 템플릿 캐시를 비활성화하기
- Thymeleaf와 FreeMarker 같은 템플릿에서는 템플릿의 파싱(코드 분석) 결과를 캐시에 저장하고 사용하도록 구성
- 템플릿이 사용되는 모든 웹 욫ㅇ마다 매번 다시 파싱되지 않게 하기 위해
- 개발 시점에는 템플릿 캐싱이 유용하지 않음. 애플리케이션이 실행 중일 때 템플릿을 변경하고 브라우저르르 새로고침하더라도 변경 전의 캐싱된 템플릿이 사용되므로 변경된 결과를 볼 수 없기 때문. 이 경우 애플리케이션을 다시 시작해야만 변경된 결과를 볼 수 있음
- DevTools는 모든 템플릿 캐싱을 자동으로 비활성화해 문제를 해결. 템플릿을 변경하더라도 브라우저만 새로고침해주면 변경된 템플릿이 적용됨
- DevTools가 사용될 때 애플리케이션과 함께 자동으로 LiveReload 서버를 활성화하면 LiveReload 브라우저 플러그인과 연결될 때는 브라우저에 전달되는 거의 모든 것에 변경이 생길 때 브라우저가 자동으로 새로고침됨
H2 콘솔
- 개발용으로 H2 데이터베이스의 사용을 선택하면, 웹 브라우저에서 사용할 수 있는 H2 콘솔도 DevTools가 자동으로 활성화해줌
- 웹 브라우저에서 http://localhost:8080/h2-console에 접속하면 애플리케이션에서 사용하는 데이터를 알 수 있음
리뷰하기
타코 클라우드 애플리케이션 구축을 위해 지금까지 했던 작업단계
- 스프링 Initializr를 사용해서 프로젝트 초기 구조 생성
- 홈페이지 웹 요청을 처리하기 위해 컨트롤러 클래스 작성
- 홈페이지를 보여주기 위해 뷰 템플릿 정의
- 애플리케이션을 테스트하기 위해 간단한 테스트 클래스 작성
- 빌드 명세를 정의한
pom.xml 파일
- Web과 Thymeleaf 의존성을 선언
- 스프링의 MVC 프레임워크, 내장된 톰캣, Thymeleaf와 Thymeleaf 레이아웃 dialect 의존성을 포함
- 스프링 부트의 자동-구성 라이브러리도 개입됨
- 애플리케이션이 시작될 때 스프링 부트 자동-구성에서 의존성 라이브러리들을 감지하고 자동으로 다음 일을 수행
- 스프링 MVC를 활성화하기 위해 스프링 애플리케이션 컨텍스트에 관련된 빈들을 구성
- 내장된 톰캣 서버를 스프링 애플리케이션 컨텍스트에 구성
- Thymeleaf 템플릿을 사용하는 스프링 MVC 뷰를 나타내기 위해 Thymeleaf 뷰 리졸버(resolver)를 구성
4. 스프링 살펴보기
핵심 스프링 프레임워크
- 스프링에 있는 모든 것의 기반. 핵심 컨테이너와 의존성 주입 프레임워크 외 몇 가지 다른 기능도 제공
- 스프링 MVC 제공
- 웹 요청을 처리하기 위해 스프링 MVC를 사용해 컨드롤러 클래스를 작성하는 방법은 이미 알아봄
- HTML이 아닌 출력을 생성하는 REST API를 만들 때도 스프링 MVC를 사용할 수 있음
- 템플릿 기반의 JDBC 지원(JdbcTemplate)을 포함해 기본적인 데이터 퍼시스턴스 지원 제공 (3장에서 자세히)
- 스프링의 가장 최신 번전에서는 리액티브 프로그래밍 지원이 추가됨
- 스프링 MVC 개념의 스프링 WebFlux라는 새로운 리액티브 웹 프레임워크가 포함됨
스프링 부트
- 액추에이터(Actuator)는 애플리케이션의 내부 작동을 런타임 시에 살펴볼 수 있는 기능을 제공하며, 메트릭(metric), 스레드 덤프 정보, 애플리케이션의 상태, 애플리케이션에서 사용할 수 있는 환경 속성이 포함됨
- 환경 속성의 명세 제공
- 핵슴 프레임워크에 추가되는 테스트 지원
- 스프링 부트 CLI(command-line interface, 명령행 인터페이스)를 제공
- 스프링 부트 CLI를 사용하면 애플리케이션 전체를 그루비 스크립트들로 작성하여 명령행에서 실행할 수 있ㅇㅁ
스프링 데이터
- 간단한 자바 인터페이스로 애플리케이션의 데이터 리퍼지터리를 정의할 수 있음
- 데이터를 저장하고 읽는 메서드를 작명 규칙을 사용해서 정의
- 스프링 데이터는 서로 다른 종류의 데이터베이스와 함께 사용 가능
- ex) 관계형 데이터베이스인 JPA, 문서형 데이터베이스인 Mongo, 그래프형 데이터베이스인 Neo4j 등
스프링 시큐리티
스프링 통합과 배치
- 대부분의 애플리케이션은 다른 애플리케이션 또는 같은 애플리케이션의 서로 다른 컴포넌트를 통합(integration)할 필요가 생김
- 이런 요구사항을 해결하기 위해 알려진 몇 가지 애플리케이션 통합 패턴이 존재
- 스프링 통합과 스프링 배치(batch)는 스프링 기반 애플리케이션의 패턴 구현을 제공
- 스프링 통합: 데이터가 사용 가능한 즉시 처리되는 실시간 통합
- 스프링 배치: 다량의 데이터가 처리되는 시점을 트리거가 알려줄 때 데이터가 수집 처리되는 배치 통합을 처리해줌
스프링 클라우드
- 애플리케이션을 하나의 단일체로 개발하는 대신 마이크로서비스라는 여러 개의 개별적인 단위들로 합성하는 것
- 스프링을 사용해 클라우드 애플리케이션을 개발하기 위한 프로젝트들의 모음인 스프링 클라우드를 사용
요약
- 웹 애플리케이션 생성, 데이터베이스 사용, 애플리케이션 보안, 마이크로서비스 등에서 개발자의 노력을 덜어주는 것이 스프링의 목표
- 스프링 부트는 손쉬운 의존성 관리, 자동-구성, 런타임 시의 애플리케이션 내부 작동 파악을 스프링에서 할 수 있게 함
- 스프링 애플리케이션은 스프링 Initializr를 사용해 초기 설정할 수 있음. 스프링 Initializr는 웹을 기반으로 하며, 대부분의 자바 개발 환경을 지원
- 빈(bean)이라 하는 컴포넌트는 스프링 애플리케이션 컨텍스트에서 자바나 XML로 선언할 수 있으며, 컴포넌트 탐색으로 찾거나 스프링 부트 자동-구성에서 자동으로 구성할 수도 있음
Chapter 1 끝!!!
07 Feb 2022
|
알고리즘
프로그래밍
자바
silver 4. 수 찾기 (1920)
출처 : https://www.acmicpc.net/problem/1920
문제
N개의 정수 A[1], A[2], …, A[N]이 주어져 있을 때, 이 안에 X라는 정수가 존재하는지 알아내는 프로그램을 작성
입력: 첫 줄에는 자연수 N이 주어짐. 다음 줄에는 N개의 정수가 주어짐. 다음 줄에 줄에는 자연수 M이 주어지고, 마지막 줄에는 M개의 정수가 주어짐. 이 수들이 A 안에 존재하는지 알아내면 됨
출력: M개의 줄에 답을 출력. 존재하면 1을, 존재하지 않으면 0을 출력
풀이
배운점
- Arrays 컬렉션 내 Binary Search를 실행해주는 메서드 존재
- 여러 개의 결과값을 리스트에 저장해 for-each문을 활용해 출력하는 방법 외에도 StingBuilder를 활용해 출력할 수 있음
07 Feb 2022
|
TIL
학습과정
1. 자바
“모던 자바 인 액션” 책으로 자바 심화 공부를 시작하였다. (Chapter 1. 무슨 일이 일어나고 있는가?)
오늘은 간단하게 JAVA 8에서 달라진 점과 장점에 대해 살펴보았고 자바 함수, 스트림, 디폴트 메서드와 자바 모듈에 대해 간단히 살펴보았다.
2. 스프링
“스프링 인 액션” 책으로 스프링 공부를 시작했다. (Chapter 1. 스프링 시작하기)
- 스프링이란? - 자바 기반 구성, 자동-구성, 스프링 부트
- 스프링 애플리케이션 초기 설정 - 스프링 Initializr, 스프링 프로젝트 구조
- 스프리 애플리케이션 작성하기 - 웹 요청 처리하기, 컨트롤러 클래스 작성, 뷰 작성, 컨트롤러 테스트, 애플리케이션 빌드하고 실행
- 스프링 살펴보기 - 핵심 스프링 프레임워크, 스프링 부트, 스프링 데이터, 스프링 시큐리티, 스프링 통합과 배치, 스프링 클라우드
이 책에서는 앞으로 타코 클라우드 온라인 애플리케이션을 생성할 것이라고 한다. 오늘은 간단히 브라우저에 인사말과 사진을 띄우는 코드까지만 작성하고 테스트를 실행해봤다.
3. 알고리즘
silver 4. 수 찾기 (1920) 문제를 풀었다.
- 문제 자체를 이해하고 구현하는 건 어렵지 않지만, 시간 제한이 짧다보니 자료구조를 사용하지 않는 이상 테스트를 통과하기 힘들 것 같다.
- 여러 탐색 방법 중 이진 탐색으로 문제를 해결했다. (자세한 내용은 위 링크 참조)
4
처음으로 하루에 자바 심화, 스프링, 알고리즘 3가지를 동시에 공부하다보니 약간 무리한 것 같다.
오늘 처음 스프링 공부를 시작해서 아직 많은 내용을 배우지는 않았지만 스프링을 공부하는 동안에는 시간이 정말 빨리 갔다. 시간 분배를 잘 해서 최대한 빠른 시간 안에 스프링 기초를 마무리 하고 토이 프로젝트를 진행해보고 싶다.