3-데이터로 작업하기

JDBC를 사용해서 데이터 읽고 쓰기 관계형 데이터를 사용할 경우 자바 개발자들이 가장 많이 사용하는 두 가지 방법은 JDBC와 JPA다. 스프링의 JDBC 지원은 JdbcTemplate 클래스에 기반을 둔다. JdbcTemplate은 JDBC를 사용할 때 요구되는 모든 형식적이고 상투적인 코드없이 개발자가 관계형 데이터베이스에 대한 SQL 연산을 수행할 수 있는 방법을 제공한다. connection 생성, statement 생성 connection, statement, result set 닫기 SQLException 예외 처리 SQLException은 checked 예외지만 대부분의 흔한 문제들은 catch 블록에서 해결될 수 없으므로 현재 메서드를 호출한 상위 코드로 처리를 넘겨야 한다....

2024-09-15 · 3 min · 473 words

2-웹 애플리케이션 개발하기

정보 보여주기 스프링 웹 애플리케이션에서는 데이터를 가져오고 처리하는 것이 컨트롤러의 일이다. 브라우저에 보여주는 데이터를 HTML로 나타내는 것은 뷰가 하는 일이다. 도메인 설정하기 도메인: 애플리케이션의 이해에 필요한 개념을 다루는 영역 class Ingredient(val id: String, val name: String, val type: Type) { enum class Type { WRAP, PROTEIN, VEGGIES, CHEESE, SAUCE } } data class Taco(val name: String? = null, val ingredients: List<String>? = null) 컨트롤러 클래스 생성하기 컨트롤러: HTTP 요청을 처리하고, 브라우저에 보여줄 HTML을 뷰에 요청하거나, 또는 REST 형태의 응답 몸체에 직접 데이터를 추가한다....

2024-09-15 · 4 min · 741 words

1-스프링 시작하기

스프링이란? 스프링 애플리케이션 컨텍스트(Spring application context): 애플리케이션 컴포넌트들을 생성하고 관리하는 컨테이너. 빈(bean): 스프링에서 관리하는 애플리케이션 컴포넌트 빈의 상호 연결은 Depedency Injection이라고 알려진 패턴을 기반으로 수행된다. 스프링 애플리케이션 컨텍스트가 빈의 생성과 관리를 자체적으로 해주며, 모든 빈을 생성, 관리하고 빈을 필요로 하는 다른 빈을 주입한다. 지금까지의 스프링 버전에서는 XML 파일을 사용해서 빈을 상호 연결하도록 스프링 애플리케이션 컨텍스트에 알려줬다. 최신 버전에서는 자바 기반의 configuration이 더 많이 사용된다. @Configuration은 이것이 각 빈을 스프링 애플리케이션 컨텍스트에 제공하는 구성 클래스라는 것을 스프링에게 알려준다....

2024-09-15 · 4 min · 770 words

9-스프링 통합하기

외부 시스템에서 데이터를 읽거나 쓸 때 애플리케이션에서 필요한 형태로 변경하기 위해 어떻게 하든 데이터 처리가 필요할 수 있다. 스프링 통합(Spring Integration)은 Enterprise Integration Patterns라는 책에서 보여준 대부분의 통합 패턴을 사용할 수 있게 구현한 것이다. 각 통합 패턴은 하나의 컴포넌트로 구현되며, 이것을 통해서 파이프라인으로 메시지가 데이터를 운반한다. 간단한 통합 플로우 선언하기 애플리케이션은 통합 플로우를 통해서 외부 리소스나 애플리케이션 자체에 데이터를 수신 또는 전송할 수 있다. 스프링 통합은 통합 플로우를 생성할 수 있게 해준다....

2024-09-15 · 5 min · 971 words

8-비동기 메시지 전송하기

이전 장에서는 REST를 사용한 동기화 통신을 알아봤다. 비동기 메시징은 애플리케이션 간에 응답을 기다리지 않고 간접적으로 메시지를 전송하는 방법이다. JMS로 메시지 전송하기 JMS(Java Message Service): 두 개 이상의 클라이언트 간에 메시지 통신을 위한 공통 API를 정의하는 자바 표준 JMS가 나오기 전에는 메시지 브로커들이 각자 나름의 API를 갖고 있어서, 애플리케이션의 메시징 코드가 브로커 간에 호화되지 않았다. 메시지 브로커: 클라이언트 간에 메시지 통신을 중개하는 역할 JMS를 사용하면 이것을 준수하는 모든 궇녀 코드가 공통 인터페이스를 통해 함께 작동할 수 있다....

2024-09-15 · 8 min · 1516 words

7-REST 서비스 사용하기

스프링 애플리케이션이 REST API를 사용하는 방법들 RestTemplate: 스프링 프레임워크에서 제공하는 간단하고 동기화된 REST 클라이언트 Traverson: 스프링 HATEOAS에서 제공하는 하이퍼링크를 인식하는 동기화 REST 클라이언트로 같은 이름의 자바스크립트 라이브러리로부터 비롯된 것이다. WebClient: 스프링 5에서 소개된 반응형 비동기 REST 클라이언트 RestTemplate로 REST 엔드포인트 사용하기 JDBC를 사용을 JdbcTemplate이 처리하듯이, RestTempalte은 REST 리소스를 사용할는데 번잡한 일을 처리해준다. RestTemplate은 REST 리소스와 상호작용하기 위한 41개의 메서드를 제공한다. 고유한 작업을 수행하는 메서드는 12개이고, 나머지는 이 메서드의 오버로딩된 버전이다....

2024-09-15 · 2 min · 236 words

6-REST 서비스 생성하기

REST 컨트롤러 작성하기 서버에서 데이터 가져오기 @CrossOrigin(origins = ["*"]) @RequestMapping(path = ["/design"], produces = ["application/json"]) @RestController class DesignTacoController( private val tacoRepository: TacoRepository ) { @GetMapping("/recent") fun recentTacos(): Iterable<Taco> { val pageRequest = PageRequest.of(0, 12, Sort.by("createdAt").descending()) return tacoRepository.findAll(pageRequest).content } } @RestController: @Controller와 @ResponseBody를 지원하는 애노테이션 @ResponseBody: 리턴 값을 HTTP 응답 바디에 직접 쓰는 값으로 사용한다. 응답 바디를 직접 작성하는 방법으로는 이외에도, ResopnsEntity 객체를 반환하는 방법이 있다. @RequestMapping produces: HTTP의 Accept 헤더에 사용되고 HTTP의 Content Negotiation에 사용된다....

2024-09-15 · 5 min · 886 words

5-구성 속성 사용하기

스프링 XML 구성으로 속성 값을 설정하던 지난 10년간은 명시적으로 빈을 구성하지 않고는 속성을 설정하는 마땅한 방법이 없었다. 스프링 부트는 구성 속성(configuration property)을 사용하는 방법을 제공한다. 스프링 애플리케이션 컨텍스트에서 구성 속성은 빈의 속성이다. 자동-구성 세부 조정하기 두 가지 형태의 서로 다르면서도 관련이 있는 구성 빈 연결: 스프링 애플리케이션 컨텍스트에서 빈으로 생성되는 애플리케이션 컴포넌트 및 상호 간에 주입되는 방법을 선언하는 구성 속성 주입: 스프링 애플리케이션 컨텍스트에서 빈의 속성 값을 설정하는 구성 스프링 환경 추상화 이해하기 스프링 환경 추상화(environment abstraction)는 구성 가능한 모든 속성을 한 곳에서 관리하는 개념이다....

2024-09-15 · 4 min · 684 words

4-스프링 시큐리티

스프링 시큐리티 활성화하기 Spring 자동 구성을 이용하여 활성화한다. https://www.baeldung.com/spring-boot-security-autoconfiguration 아래 의존에는 SecurityAutoConfiguration 클래스가 포함되어 있어서, 자동으로 시큐리티 구성이 된다. <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-security</artifactId> </dependency> Spring 자동 구성은 다음과 같이 구성된다. 모든 HTTP 요청 경로는 인증되어야 한다. 어떤 특정 역할이나 권한이 없다. 스프링 시큐리티의 기본 HTTP 기본 인증을 사용해서 인증된다. 사용자는 하나만 있으며, 이름은 user다. 비밀번호는 암호화해 준다. 시큐리티가 활성화되면 기본적으로 설정되는 프로퍼티가 있다. spring.security.user.name spring.security.user.password 따로 설정하지 않았으면 비밀번호가 랜덤으로 생성되면 콘솔 로그에 출력된다....

2024-09-15 · 5 min · 895 words

19-스프링 배포하기

배포 옵션 빌드 및 실행 방법 STS나 IntelliJ IDEA 등의 IDE에서 애플리케이션을 빌드하고 실행 메이븐 springboot:run이나 그래들 bootRun 태스크를 사용해서 명령행에서 애플리케이션을 빌드하고 실행한다. 메이븐이나 그래들을 사용해서 실행 가능한 JAR 파일을 생성한다. 메이븐이나 그래들을 사용해서 WAR 파일을 생성한다. 배포 방법 자바 애플리케이션 서버에 배포하기: 톰캣, 웹스피어, 웹로직 등의 자바 애플리케이션 서버에 애플리케이션을 배포해야 한다면, 선택의 여지없이 WAR 파일로 애플리케이션을 빌드해야 한다. 클라우드에 배포하기: AWS, Azure 등의 클라우드 플랫폼으로 배포한다면, 실행 가능한 JAR 파일이 최사으이 선택이다....

2024-09-15 · 3 min · 507 words

18-JMX로 스프링 모니터링하기

JMX(Java Management Extensions): 자바 애플리케이션을 모니터링하고 관리하는 표준 방법 JMX는 MBeans(managed beans) 컴포넌트를 노출함으로써 외부의 JMX 클라이언트는 오퍼레이션 호출, 속성 검사, MBeans의 이베트 모니터링을 통해 애플리케이션을 관리할 수 있다. JMX는 스프링 부트 애플리케이션에 기본적으로 자동 활성화된다. 이예 따라 모든 액추에이터 엔드포인트는 MBeans로 노출된다. 또한, 스프링 애플리케이션 컨텍스트의 어떤 다른 빈도 MBeans로 노출할 수 있게 했다. 액추에이터 MBeans 사용하기 스프링 부트는 /heapdump를 제외한 모든 액추에이터 엔드포인트가 HTTP처럼 명시적으로 포함시킬 필요 없이 기본으로 MBeans로 노출되어 있다....

2024-09-15 · 1 min · 183 words

17-스프링 관리하기

스프링 부트 Admin 사용하기 스프링 부트 Admin은 관리용 프론트엔드 웹 애플리케이션이며, 액추에이터 엔드포인트를 사람들이 더 많이 소비할 수 있게 한다. 액추에이터 엔드포인트는 두 개의 주요 구성 요소로 나뉜다. 스프링 부트 Admin 클라이언트 Admin 서버 생성하기 일반적으로 Admin 서버는 독립 실행형 애플리케이션으로 사용된다. 의존성 추가 구성 클래스에 @EnableAdminServer 애노테이션 추가 아래 사진에서는 현재 0개 애플리케이션의 0개의 인스턴스가 등록되어 있는 것이다. Admin 클라이언트 등록하기 두 가지 방법 각 애플리케이션이 자신을 Admin 서버에 등록 Admin 서버가 유레카 서비스 레지스트리를 통해서 서비스를 찾기 각 애플리케이션이 자신을 Admin 서버에 등록 의존성 추가 spring....

2024-09-15 · 3 min · 565 words

16-스프링 부트 액추에이터 사용하기

액추에이터: 스프링 부트 애플리케이션의 모니터링이나 메트릭과 같은 기능을 HTTP와 JMX 엔드포인트를 통해 제공한다. 액추에이터 개요 액추에이터가 노출하는 엔드포인트를 사용하면 실행 중인 스프링 부트 애플리케이션의 내부 상태에 관한 것을 알 수 있다. 액추에이터의 기본 경로 구성하기 기본적으로 액추에이터의 모든 엔드포인트 경로에는 /actuator가 앞에 붙는다. 기본 경로를 수정하고 싶으면, management.endpoint.web.base-path 속성을 설정하여 변경할 수 있다. 액추에이터 엔드포인트의 활성화와 비활성화 엔드포인트의 노출 여부를 제어할 때는 management.emdpoints.web.exposure.include와 management.endpoints.web.exposure.exclude 속성을 사용하면 노출을 원하는 엔드포인트를 지정할 수 있다....

2024-09-15 · 5 min · 865 words

15-실패와 지연 처리하기

서킷 브레이커 이해하기 서킷 브레이커 패턴은 우리가 작성한 코드가 실행에 실패하는 경우에 안전하게 처리되도록 해준다. 마이크로서비스의 경우, 한 마이크로서비스의 실패가 다른 마이크로서비스의 연쇄적인 실패로 확산되는 것을 방지해야 하기 때문에 더 중요하다. 서킷 브레이커는 메서드의 호출을 허용하며, 서킷은 닫힘 상태에서 시작된다. 어떤 이류로 실패하면, 서킷 브레이커가 개방되고 실패한 메서드에 더 이상 호출이 수행되지 않는다. 대신 폴백을 제공하여 자체적으로 실패를 처리한다. 개방 상태의 서킷이 때때로 절반-열림 상태로 바뀌면서 실패했던 메서드의 호출을 서킷 브레이커가 다시 시도한다....

2024-09-15 · 4 min · 681 words

14-클라우드 구성 관리

스프링 클라우드의 구성 서버는 애플리케이션의 모든 마이크로서비스에 대해 중앙 집중식의 구성(config)를 제공한다. 구성 서버를 사용하면 애플리케이션의 모든 구성을 한 곳에서 관리할 수 있다. 구성 공유하기 application.yml 또는 application.properties 파일 속성만 변경하기 위해 애플리케이션을 재배포해야된다. 데이터베이스 비밀번호와 같은 일부속성들은 개발자 조차 접근할 수 없도록 해야한다. 자바 시스템 속성이나 운영체제의 환경 변수에 구성 속성을 설정하는 경우 속성의 변경으로 인해 애플리케이션이 재시작되어야 한다. 데이터베이스 비밀번호와 같은 일부속성들은 개발자 조차 접근할 수 없도록 해야한다....

2024-09-15 · 6 min · 1260 words

13-서비스 탐구하기

마이크로서비스 이해하기 단일 애플리케이션의 문제점 코드 전체를 파악하기 어렵다. 테스트가 복잡해진다. 라이브러리 간의 충돌이 생기기 쉽다. 확장 시 비효율적이다. 확장 목적으로 더 많은 서버에 애플리케이션을 배포해야 할 때는 애플리케이션의 일부가아닌 전체를 배포해야 한다. 적용할 기술을 결정할 때도 애플리케이션 전체를 고려해야 한다. 프로덕션으로 이양하기 위해 많은 노력이 필요하다. 단일 애플리케이션은 크기와 복잡도 때문에 더 엄격한 개발 프로세스와 테스트가 필요하다. 마이크로서비스 아키텍처 코드를 이해하기 쉽다. 테스트가 쉽다. 라이브러리 비호환성 문제가 생기지 않는다. 독자적으로 규모를 조정할 수 있다....

2024-09-15 · 4 min · 735 words

12-리액티브 데이터 퍼시스턴스

컨트롤러부터 데이터베이스에 이르기까지 데이터의 전체 플로우가 리액티브하고 블로킹되지 않는 것이 중요하다. 만일 블로킹되는 리퍼지터리에 의존하는 스프링 WebFlux 리액티브 컨트롤러를 작성한다면, 이 컨트롤러는 해당 리퍼지터리의 데이터 생성을 기다리느라 블로킹될 것이다. 스프링 데이터 리액티브 개념 이해하기 현재는 카산드라, 몽고DB, 카우치베이스, 레디스로 데이터를 저장할 때 리액티브 프로그래밍 모델을 지원한다. 관계현 데이터베이스나 JPA는 리액티브 리퍼지터리가 지원되지 않는다. 스프링 데이터 JPA로 리액티브 프로그래밍 모델을 지원하려면 관계형 데이터베이스와 JDBC 드라이버 역시 블로킹되지 않는 리액티브 모델을 지원해야 한다....

2024-09-15 · 5 min · 965 words

11-리액티브 API 개발하기

스프링 WebFlux: 스프링 5의 새로운 리액티브 웹 프레임워크 스프링 WebFlux 사용하기 스프링MVC 같은 전형적인 서블릿 기반의 웹 프레임워크는 스레드 블로킹과 다중 스레드로 수행된다. 기본적으로 하나의 요청 당 하나의 스레드가 처리하고, 하나의 스레드 내에서 대부분의 상호 작용이 블록킹된다. 블로킹 웹 프레임워크는 요청량의 증가에 따른 확장이 어렵다. 처리가 느린 작업 스레드로 인해 스레드 풀로 반환되어 또 다른 요청 처리를 준비하는 데 많은 시간이 걸린다. 비동기 웹 프레임워크는 적은 수의 스레드로 더 높은 확장성을 성취한다....

2024-09-15 · 6 min · 1093 words

10-리액터 개요

애플리케이션 코드를 개발할 때는 명령형과 리액티브의 두 가지 형태로 코드를 작성할 수 있다. 명령형: 순차적으로 연속된 작업이 있으며, 각 작업은 한 번에 하나씩 그리고 이전 작업 다음에 실행된다. 리액티브: 데이터 처리를 위해 일련의 작업들이 정의되지만, 이 작업들은 병렬로 실행될 수 있다. 그리고 각작업은 부분 집합의 데이터를 처리할 수 있으며, 처리가 끝난 데이터를 다음 작업에 넘겨주고 다른 부분 집합의 데이터로 계속 작업할 수 있다. 리액티브 프로그래밍 이해하기 명령형 프로그래밍 한 번에 하나씩 만나는 순서대로 실행되는 명령어들로 코드를 작성 프로그램에서는 하나의 작업이 완전히 끝나기를 기다렸다가 그당므 작업을 수행한다....

2024-09-15 · 6 min · 1237 words