50장
Spring boot 시작하기 – 목표
스프링 부트 없이도 웹 애플리케이션 제작할 수 있다. 그러면 왜 필요할까? 스프링부트 프레임워크의 목표는 무엇일까?
스프링부트 이전/이후 차이를 비교해 보고,간단한 REST API를 스프링부트로 구현해 보자.
51장
Spring boot의 이전 세계 이해 – 대략적으로 알아보기
스프링부트 이전에는 많은 것을 성정해야 웹 애플리케이션을 구현할 수 있었다. 먼저 의존성 관리 측면에서 봤을 때, REST API를 만든다고 했을 때, spring framework, spring MVC, JSON binding framework, 로깅 등이 필요하다. 모든 의존성과 버전을 pom.xml에 등록해야 했다. 그 외에 유닛 테스트를 진행할 때 또 spring test 등을 가져와야 했다. Web.xml도 마찬가지다. 웹 애플리케이션 설정에 필요하지만 spring MVC를 활용하려 하면 DispatcherServlet 등을 설정해야 했다. 그 외에 스프링 설정(component scan, view resolver 설정 등)이 있었다.
이와 같이 스프링부트 이전에는 작동하지 않는 기능들(로깅, 에러 핸들링, 모니터링)을 수동으로 구현해야 했다. 이 모든 작업들이 새 프로젝트 진행 시마다 반복이 되었다. 유지보수 하는 데에도 상당한 시간 투자가 필요했다.
스프링부트가 도입되고 나서는 얼마나 간단해졌는지 살펴볼 수 있다.
52장
Spring initializer로 새 spring boot project 설정하기
Start.spring.io 사이트에서 간단하게 몇 가지 선택하면 스프링부트 프로젝트를 시작할 수 있다. 빌드 도구 Maven으로 하고, 자바를 선택한다. 버전은 SNAPSHOT을 제외한 Milestone 버전을 선택한다. 스냅샷은 개발 중인 버전이기 때문에 불안정하다.
Project Metadata :
-Group ID / Artifact ID : 클래스 이름 및 패키지 이름과 유사하다.
이와 같이 설정을 마치고 진행한다.
Next를 한 후 의존성에 spring web을 추가해 준다.로 웹 애플리케이션을 사용하고 Apache Tomcat을 임베디드 컨테이너로 사용해 줄 것이다.
/main/java 에는 소스코드가 들어가고. /main/resources에는 애플리케이션 설정이 들어간다. Src/test에는 단위 테스트를 작성한다.
External libraries에는 엄청난 양의 dependencies 가 들어가 있다.
Main을 실행하면 콘솔에서
이렇게 뜨는 것을 확인할 수 있다.
로그 끝 부분에 tomcat이 8080으로 시작됐고, 애플리케이션이 3.5초에 걸쳐 시작된 것을 확인할 수 있다.
53장
Spring boot를 사용하여 helloworld API 빌드하기
Rest api를 만들어보자. 일단 새로운 클래스를 만든다.
@restController는 Json형태로 객체 데이터를 반환하는 역할을 한다. 데이터를 응답으로 제공하는 REST API를 개발할 때 주로 사용하는 어노테이션이다. @RequestMapping 어노테이션은, url 주소를 나타낸다. 검색하면 메서드의 결과가 나온다.
사용한 Course 클래스 역시 만들어준다. 그 후 실행을 해주면
이렇게 JSON 응답이 아주 깔끔하고 간단하게 반환되는 것을 확인할 수 있다. 스프링부트를 이용하면 다른 것에 신경 쓸 필요 없이 비즈니스 로직에만 집중하면 되는 것을 볼 수 있다. 스프링 빈이나 XML을 설정할 필요도 없다. 스프링부트 백그라운드에서 많은 일들이 일어나기 때문이다.
54장
SPRING BOOT의 목표 이해하기
가장 중요한 목표 : 빠르게 애플리케이션 개발하기 / 프로덕션 환경에 사용 가능하도록 만들기
1)
-spring initializer
-spring boot starter projects
-spring boot auto configuration
-spring boor devtools
등을 이용하여 빠른 개발을 가능하게 한다.
2)
-logging
-다양한 환경에 맞는 다양한 설정 제공
-애플리케이션 모니터링
등을 이용하여 프로덕션 환경에 적응 가능하게 한다.
55장
스프링 부트의 강력함 이해하기 -spring boot starter project
스프링부트에서 프레임워크별 그룹화하여 작업을 한다.
-build a REST API
-Write Unit Tests
등등 있을 때 어떻게 그룹화해서 애플리케이션을 쉽게 빌드할 것인가? Starter project는 다양한 기능을 위한 편리한 의존성 디스크립터를 제공한다.
현재 web과 test에 대해서 starter project를 실행하고 있다. 특정 프로젝트에 필요한 기능에 따라 starter project를 입력하면 된다.
56장
Spring boot의 강력함 이해하기 – auto configuration
애플리케이션 개발에 필요한 작업을 간소화 하기 위해서, 자동화 설정인 auto configuration을 사용하면 된다. 모든 auto configuration은 spring-boot-autoconfigure-3.3.1.jar 에서 이루어진다. 웹 애플리케이션 개발 및 REST API와 관련된 모든 자동 설정이 이 패키지와 하위 패키지에서 이루어진다. 자동 설정을 좀 더 자세히 확인하려면 application.properties는 src/main/resources에 있다. 여기에서 로깅 수준을 debug로 입력해야 한다.
그리고 실행을 하면, 디폴트 로깅 수준인 INFO에서 DEBUG를 포함해서 출력한다.
57장
Spring dev tool로 빠르게 빌드하기
개발자의 생산성은 매우 중요하다. 코드를 변경할 때마다 수동으로 서버를 재시작해야 하는 것이 비효율적이다. 자동으로 서버를 다시 시작하고 코드 변경사항을 적용하게 할 수 있다면?
Spring devtools를 사용할 수 있다. 애플리케이션의 다시 시작을 자동으로 트리거하므로 수동으로 서버를 재시작할 필요 없다.
58장
스프링부트로 프로덕션 환경 배포 준비하기 -1- profile
1) 프로필을 사용하여 애플리케이션 설정을 관리하는 기능
: 동일한 애플리케이션의 다양한 환경에는 다양한 설정이 필요하다. 다른 DB와 통신하거나 다른 웹 서비스를 호출할 수도 있다. 개발 환경은 개발 DB와 통신하고 테스트 환경은 테스트 DB와 통신한다. 이것이 프로필 개념이다. 프로필을 통해 환경별 설정이 가능하다.
- DEV / QA / STAGE / PROD 각 환경을 위한 별도의 설정을 만들 수 있다.
DEV / prod만 있다고 생각해 보자.
이렇게 properties를 새로 만들어준 후,
application.properties 에 입력해 줄 수 있다.
59장
Spring boot로 프로덕션 환경 배포 준비하기 -2- configurationProperties
좀 더 복잡한 설정 방식을 보자.
현재 통신하고 있는 통화 서비스가 있고, 이 서비스의 여러 값을 설정한다고 생각해 보자.
이렇게 등등 작성할 수 있다.
애플리케이션을 위해 애플리케이션 설정을 많이 생성하려는 경우, 스프링부트에서 권장되는 방식은 configuration properties를 사용하는 것이다.
새로운 클래스를 만든 후, 매핑할 url을 만든다.
표시할 url/username/key를 application.properties에 등록한다. 그 후 실행하면,
이렇게 나오는 것을 확인할 수 있다.
60장
Spring boor로 프로덕션 환경 배포 준비하기 -3- embedded server
Spring boot embedded server를 사용하여 배포를 간소화하는 방법은 무엇일까? 개발자들은 프로덕션에 무언가를 배포할 때 배포 프로세스가 아주 간단하기를 바란다.
일반적인 배포방식은 WAR Approach라고 한다.
자바 설치 -> 웹/애플리케이션 서버(톰캣, 웹스피어, 웹로직 등) 설치 -> WAR 배포
Embedded server는 더 단순하다. 자바를 설치하기만 하면 JAR 파일 실행할 수 있다.
먼저 MAVEN에 들어가서 clean과 install을 해준다.
Jar가 빌드되고 있는 것을 볼 수 있다. 명령 프롬프트로 jar의 위치를 파악한다.
그 후
를 하면 JAR 파일을 사용하여 애플리케이션을 아주 쉽게 실행할 수 있고, URL을 사용할 수 있다.
61장
Spring boot로 프로덕션 환경 배포 준비하기 -4- actuator
프로덕션 환경에서 사용 가능한 애플리케이션의 또 다른 중요 기능인 모니터링을 알아보자. Actuator는 여러 개의 엔드포인트들을 제공해 준다.
62장
Spring boot, spring, spring MVC 이해하기
스프링 프레임워크 : 의존성 주입 - @component, @autowired, @componentscan ,,
의존성 주입만으로는 강력한 애플리케이션을 빌드할 수 없다.
DB와 통신해야 한다면 Hibernate/JPA가 필요할 것이고, UNIT TEST를 하려면 JUNIT/Mockito가 필요할 것이다. 스프링 프로젝트와 모듈은 스프링 생태계를 더 확장시킨다.
Spring MVC : 모듈이다. 핵심은 웹 애플리케이션과 REST API의 빌드 과정을 간소화하는 것이다.
-@controller, @restController, @requestMapping과과 같은 어노테이션을 사용할 수 있다.
그러나, 스프링 프레임워크와 스프링 MVC를 사용할 때마다 pom.xml, web.xml, applicationcontext.xml 등에 모든 설정들을 입력해주어야 했다. 그래서 스프링 부트가 필요하다.
Spring boot : 프로덕션 환경에 사용 가능한 애플리케이션을 빠르게 빌드하도록 지원한다. 주요 기능은 starter project와 auto configuration이다. 웹 애플리케이션을 개발하려는 경우 web starter가 필요한 모든 의존성을 가져오고, auto configuration을 사용하면 spring과 spring MVC, 다른 프레임워크를 설정할 필요가 없다. 클래스 경로에 있는 항목에 따라 디폴트 설정을 자동으로 제공한다.
또한 여러 가지 비기능 요소 또한 지원한다.
애플리케이션 모니터링(actuator), JAR 배포 과정 간소화(embedded server), 디폴트 로깅, 오류 처리 등도 제공한다.
64장
SPRING BOOT 시작하기 -복습
Spring boot terminology :
-starter projects
-auto configuration
-actuator
-devtools
장점 : 빠른 프로덕션 개발
65장
JPA와 Hibernate 시작하기 – 목표
스프링부트를 현대적으로 접근해서 간단한 JPA 앱 만들어보자. JPA 이전/이후를 비교하면서 알아보자.
66장
JPA와 Hibernate에 맞는 새 스프링부트 프로젝트 설정하기
Spring initializar를 통해 새로운 프로젝트를 만들자.
네 가지 종속성을 추가해 주자.
Pom.xml에서 4가지 종속성이 잘 입력된 것을 볼 수 있다.
JDBC 초기화가 진행되었고 HikariPool과 Hibernate 역시 잘 들어왔고, tomcat이 포트 8080에서 실행되고 있는 것도 보인다.
67장
H2 코솔 실행하기 및 H2에서 과정 테이블 생성하기
H2 DB는 인메모리 데이터베이스이다. H2를 사용하고 싶으면 이 URL을 이용하면 된다. 이 URL은 동적으로 생성된다.
Application.properties에 spring.h2.console.enabled=true로 등록하고, 서버를 재시작한다.
가져온 URL을 JDBC URL에 입력해 준다.
만약, url을 정적으로 구성하고 싶으면 Application.properties에
spring.datasource.url=jdbc:h2:mem:testdb
라고 입력해 주면 된다.
이제 schema.sql이라는 파일을 resource 안에 만들어주고, table을 만들어준다.
Spring data JPA Starter를 활용할 때마다 자동으로 schema.sql 파일을 가져와서 H2에 테이블을 생성해 준다.
H2-console에서 데이터가 잘 들어왔는지 확인할 수 있다.
68장
Spring JDBC 시작하기
H2 콘솔 자체에서 데이터를 입력할 수 있다.
잘 들어온 것을 확인할 수 있다.
69장
Spring JDBC를 사용하여 하드코드로 작성된 데이터 삽입하기
insert into course(id, name, author)
values(1, 'LEARN AWS', 'IN28MINUTES');
이 코드를 어떻게 spring JDBC로 작성할 수 있을까?
이렇게 작성하고 실행하면, H2-console에서 결과를 확인할 수 있다.
70장
Spring JDBC를 사용하여 데이터 삽입 및 삭제하기
특정course의 세부 항목을 어떻게insert 할 수 있을까?
이렇게 바꿔주고 Course 클래스를 생성해 준다.
Course 클래스에 게터/toString/생성자를 만들어준다.
그 후 INSERT_QUERY에서 쿼리에서 VALUES(?, ?, ? ) 로 바꿔준다. .update() 될 때 값을 전달하면 입력이 될 것이다.
값을 여기서 입력하여 repository에 넣어준다.
실행하면 이와 같이 DB에 잘 들어간다.
삭제는 어떻게 할까? Id를 통해 삭제해 보자.
이렇게 하고 재시작을 해보면, 아무 것도 입력이 안 되는 것을 볼 수 있다. Insert 되자마자 삭제되었기 때문이다.
71장
Spring JDBC를 사용하여 데이터 쿼리하기
이번에는 id를 통해 쿼리를 찾아보자. 쿼리를 실행할 때 Course를 돌려받아야 하기 때문에 반환값은 Course로 한다. Update 메소드를 사용할 수 없기 때문에 query 메소드를 선택해야 한다. 결과값을 하나만 돌려받을 거라면(예로, id로 쿼리를 할 때는 해당하는 id의 course 한 개만 반환하기 때문에) queryForObject 메서드를 사용한다. 이제 중요한 과정이 남았다.
Mapping 해야 한다. Select 쿼리를 실행하면 ResultSet을 받기 때문에, ResultSet를 가져와 Course bean에 매핑해야 한다. 두 번째 매개변수는 ResultSet을 bean으로 매핑해 주는 역할을 해야 한다. ResultSet을 bean으로 매핑하는 것을 row mapper라고 한다. Row mapper는 ResultSet의 각 행을 특정 bean에 연결해 준다.특정 상황에서 테이블에 있는 열의 이름과 bean에 있는 이름과 짝을 이룬다. beanPropertyRowMapper를 사용하여 결과를 매핑하는데 Course 클래스로 매핑한다. 이를 return 해준다.
이렇게 하고 실행하면,
잘 입력된 것을 확인할 수 있다.
H2에도 id(1)은 삭제되고 2,3만 남은 것을 확인할 수 있다.
72장
JPA와 EntityManager 시작하기
JDBC를 사용하면 자바 코드는 간단해지지만 쿼리는 상당히 복잡하다. 테이블이 많아질수록 아주 복잡해질 것이다. JPA를 사용하면 직접 매핑할 수 있다. 자바 빈과 테이블 사이에 매핑을 생성하고 그 매핑을 이용해서 값을 삽입하고 값을 검색하고 테이블에서 작동할 수 있다.
COURSE에 @ENTITY 어노테이션을 입력한다. JPA를 사용할 때마다 자바 빈을 테이블에 매핑한다. 엔티티를 관리할 클래스를 만든 후 EntityManager를 활용한다. 행을 삽입하는 메서드는entityManager.merge이다.모든 매핑이 되어 있기 때문에 Course 빈은 COURSE 테이블로 매핑이 된다.
이렇게 하면, 역시 결과가 깔끔하게 나온다.
73장
JPA의 마법 알아보기
JDBC : 쿼리와 자바 코드 많이 작성해야 했다.
SPRING JDBC : 쿼리는 많았지만 자바 코드는 적었다.
JPA : 다른 접근 방식 제공한다. 쿼리에 대해서는 신경 쓰지 않고, “엔티티만 테이블로 매핑한다.”
'스프링,스프링부트' 카테고리의 다른 글
유데미 RANGA 86장-92장 요약 (2) | 2024.07.02 |
---|---|
유데미 RANGA 74-85장 요약 (0) | 2024.06.28 |
유데미 RANGA 24~48장 수업 (0) | 2024.06.25 |
유데미 RANGA 스프링부트 13-23장 요약 (0) | 2024.06.24 |
유데미 RANGA 스프링부트 1-12장 요약 (0) | 2024.06.22 |