본문 바로가기
프로그래밍/SpringBoot

스프링부트를 이용한 웹서비스 제작 따라하기(1)

by mrvan 2019. 1. 29.

이 글은 jojoldu라는 개발자분께서 만드신

1) 스프링부트로 웹 서비스 출시하기 - 1. SpringBoot & Gradle & Github 프로젝트 생성하기 를 따라하면서 궁금하거나 공부한 내용을 적는 일기입니다!



개발환경
 - IDE : intellij IDEA Ultimate(학생 버전으로 사용)
 - Git Tools : Source Tree
 - OS : Windows 10
 - SpringBoot 버전 확인해보기!
 - Java 8
 - Gradle

Gradle vs Maven
1. 프로젝트 구성과 빌드는 근본적으로 "구성"이라는 정적인 요소와 "빌드"라는 동적인 요소의 집합이다. 
이를 Maven은 정적인 데이터를 저장하는 XML로 만들어서 동적인 행위 정의를 매우 어렵게 만들었다.
  -> Maven의 가장 큰 문제이며 이로인한 복잡한 프로젝트에서 설정이 거의 불가능한 상황이 자주 발생
Gradle은 DSL(Domain Specific Language)로 설정 정보를 구성하고, 그 자체가 Groovy 스크립트 언어이므로 동적인 작업은 그냥 Groovy 코드로 즉석에서 작성하면 됨.
※Gradle은 Groovy라는 언어를 기반으로 만들어진 빌드 도구이며, Groovy는 Java 가상 머신에서 실행되는 스크립트 언어이다(Java와 달리 소스코드를 컴파일할 필요가 없음)

2. Maven은 상속 구조를 사용해 멀티 모듈을 구현하지만, Gradle은 구성 주입을 사용한다.
 - Maven에서 특정 설정을 몇몇 모듈에서만 공통으로 사용하려면 불필요하게 부모 프로젝트를 생성하여 설정하고 그것을 자식들이 상속하게 해야한다.게다가 다른 모든게 같더라도 약간이라도 설정이 다른 프로젝트가 하나라도 있다면 그 프로젝트는 상속을 할 수 없고, 거의 모든 설정을 중복해서 해당 프로젝트에 넣어줘야 한다.
 - Gradle은 공통 설정을 조건에 따라 특정프로젝트에만 주입 가능하다.

3. 프로젝트에 상대적인 파일 경로로 작업을 할 때 Gradle은 rootProject.file()로 쉽게 구성이 가능하다.

4. Maven은 자신만의 플러그인을 만들기가 힘들다. 하지만 Gradle은 build.gradle 혹은 buildSrc를 통해 자신만의 플러그인과 테스크를 매우 쉽게 정의할 수 있다.

5. Gradle은 Ant 태스크를 바로 가져다가 사용할 수 있기 때문에 수많은 Java Ant 태스크들을 이미 내장하고 있는 것이나 다름 없다.

6. Gradle은 Task간의 작동 순서 정의가 매우 쉽다. Maven은 정적인 특성 때문에 특정 태스크를 반복 수행하거나 하는 등의 작업이 힘들고, 다른 Phase에 태스크를 끼워넣는 것도 직관적이지 못하다.

7. Gralde은 Maven 플로그인으로는 있으나 gradle 혹은 Ant플러그인이 없을 경우 그냥 외부 프로그램을 실행해버리거나 Groovy로 Maven 플러그인의 Java 코드를 호출해서 실행하면 된다.


Lombok
Lombok이란 자바에서 @Getter, @Setter같은 annotation 기반으로 관련 기존 DTO, VO, Domain Class를 작성할 때, 멤버 변수에 대한 Getter/Setter Method, Equals(), hashCode(), ToString()과 멤버 변수에 값을 설정하는 생성자 등을 자동으로 생성해주는 라이브러리

JPA(Java Persistent API)
기존 EJB ORM이던 Entity Bean을 JPA라고 바꾸고 JavaSE, JavaEE를 위한 영속성 관리와 ORM을 위한 표준 기술이다. JPA는 ORM 표준 기술로 Hibernate, OpenJPA, EclipseLink, TopLink Essentials과 같은 구현체가 있고 이에 표준 인터페이스가 바로 JPA이다.
※ORM은 Object Relational Mapping의 약자로서 객체지향에서 말하는 개체와 데이터베이스의 개체가 상당히 유사하다는 것을 기초로 시작되었으며, 이러한 유사한 점들이 객체지향에서의 객체와 데이터베이스의 개체를 한번에 처리할 수 있을까라는 고민점에서 시작되었다. 이는 특정 데이터베이스에 종속된 개념이 아니고, 객체지향의 객체와 데이터베이스의 개체를 매핑시킨다는 추상적인 개념이다.
 1. 장점
(1) 데이터베이스 관련 코드에 대해 유연함을 얻을 수 있습니다.
- 데이터베이스 변경은 화면단에서부터 시작해 DAO, 서비스등에 많은 영향을 끼칩니다. 이를 JPA를 통해서 구현한다면 설계를 한번에 처리할 수 있기 때문에 높은 효율성을 기대할 수 있다.
(2) 데이터베이스와 독립적인 관계이다.
- 특정 데이터베이스에서 동작하는 것이 아니기 때문에 버전 이슈나 다른 데이터베이스로 변경한다 해도 큰 변화가 없습니다.
(3) 객체지향적으로 개발이 가능하며 객체 자체에 집중할 수가 있습니다.

 2. 단점
(1) 잘 배워야 함.
(2) 근본적인 객체지향 설계 사상이 반영되어야 합니다.
(3) 특정 데이터베이스의 강력함을 사용할 수 없다.
- SQL 튜닝등의 작업에 제약이 생길 수 있다.


H2
H2는 자바로 작성된 RDBMS이다.

Spring Boot Actuator
HTTP를 이용하여 어플리케이션의 관리나 모니터링에 도움이 되는 기능들을 제공한다. 이 기술은 실행중인 어플리케이션 내부를 볼 수 있는 웹 End point를 제공하는 것이다.


.gitignore

각 IDE에서 프로젝트가 생성되면 자동으로 생성되는 파일들을 굳이 Git으로 관리할 필요가 없기 때문에 Git 체크대상에서 제외