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

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

by mrvan 2019. 1. 29.

이 글은 jojoldu라는 개발자님이 만드신

2) 스프링부트로 웹서비스 출시하기 - 2. SpringBoot & JPA로 간단 API 만들기를 따라하면서 생긴 궁금점을 적는 일기장입니다!



Spring(Spring MVC) vs SpringBoot

1. Spring

(1)스프링 프레임워크의 가장 중요한 특징은 의존성 주입(DI,Dependecy Injection)이다. 모든 스프링 모듈들의 핵심에는 의존성 주입이나 IOC(Inversion of Control)가 있다.


(2)스프링 프레임워크의 가장 훌륭한 점은 이미 해결된 문제를 해결하려고 시도하지 않는다는 것이다. 스프링 프레임워크가 하는 모든 것은 훌륭한 솔루션을 제공하는 프레임워크들을 훌륭하게 통합해 주는 일이다.

         - Hibernate for ORM

         - iBatis for Object Mapping

         - JUnit and Mockito for Unit Testing


(3) Spring MVC 프레임워크는 디커플된 웹 애플리케이션 개발 방법을 제공한다. Dispatcher Servlet, ModelAndView, View Resolver과 같은 단순 개념을 이용해서 웹 애플리케이션 개발을 쉽게 할 수 있도록 해준다.


2. Spring Boot

(1) 보통 Spring MVC를 사용할 때, 우리는 컴포넌트 스캔, 디스패쳐 서블릿, 뷰 리졸버, 웹 jar들(정적 컨텐츠를 제공하기 위한)을 설정해야 한다.

Spring Boot에서는 새로운 사고방식을 통해 클래스패스상에 사용가능한 프레임워크와 이미있는 환경설정을 바라본다. 이것들을 기반으로 애플리케이션을 이 프레임워크들과 함께 구성하는데 필요한 기본 환경 설정을 제공한다. 이것을 "Auto Configuration"이라고 부른다.


(2) Spring MVC에서는 웹 애플리케이션 개발 시, 사용하고 싶어하는 프레임워크들과 그 프레임워크들의 버전을 선택하고 그것들을 함께 연결할 방법을 찾는다. 이 때 우리는 모든 프레임워크들이 호환되는 버전을 선택해야 했다.

Spring Boot에서는 starter들에 대해 아래와 같이 기술한다.

- 스타터들은 편리한 종속성 기술자들(dependency descriptors)로서 여러분은 이 것을 애플리케이션에 포함시킬 수 있다. 여러분은 모든 스프링과 여러분이 필요로하는 고나련 기술을 얻을 수 있는 올인원 쇼핑몰을 얻는 것으로 굳이 샘플코드를 찾아보거나 로드할 종속성 기술자들을 복사/붙여넣기 하지 않아도 된다. 예를들어 여러분이 스프링과 데이터베이스 접근을 위한 JPA를 사용하고 싶다면 여러분의 프로젝트에 spring-boot-starter-data-jpa종속성을 포함시키고 진행하면 된다. 


출처 : http://blog.naver.com/PostView.nhn?blogId=sthwin&logNo=221271008423&parentCategoryNo=&categoryNo=50&viewDate=&isShowPopularPosts=true&from=search


JPA 어노테이션

1. @Entity

- 테이블과 링크될 클래스임을 나타냄

- 언더스코어 네이밍(_)으로 이름을 매칭합니다.

- ex) SalesManager.java -> sales_manager table


2. @Id

- 해당 테이블의 PK 필드를 나타냅니다.


3. @GeneratedValue

- PK의 생성 규칙을 나타냅니다.

- 기본값은 AUTO로, MySQL의 auto_increment와 같이 자동증가하는 정수형 값이 됩니다.

- 스프링 부트 2.0에선 옵션을 추가하셔야만 auto_increment가 됩니다!


4. @Column

- 테이블의 컬럼을 나타내면, 굳이 선언하지 않더라도 해당 클래스의 필드는 모두 컬럼이 됩니다.

- 사용하는 이유는, 기본값 외에 추가로 변경이 필요한 옵션이 있을경우 사용합니다.

- 문자열의 경우 VARCHAR(255)가 기본값인데, 사이즈를 500으로 늘리고 싶거나, 타입을 TEXT로 변경하고 싶거나 등의 경우에 사용됩니다.


Lombok 어노테이션

1. @NoArgsConstructor : 기본 생성자 자동 추가

- access = AccessLevel.PROTECTED : 기본 생성자의 접근 권한을 protected로 제한

-> 생성자로 protected 클래스명 {}와 같은 효과

-> Entity 클래스를 프로젝트 코드상에서 기본생성자로 생성하는 것은 막되, JPA에서 Entity 클래스를 생성하는것은 허용하기 위해 추가


2. @Getter : 클래스내 모든 필드의 Getter 메소드를 자동생성


3. @Builder : 해당 클래스의 빌더패턴 클래스를 생성

- 생성자 상단에 선언시 생성자에 포함된 필드만 빌더에 포함


Repository

보통 ibatis/MyBatis등에서 Dao라고 불리는 DB Layer 접근자이며, JPA에서는 Repository라고 부르며 인터페이스로 생성한다.

특별히 @Repository를 추가할 필요가 없음!!!!

1. 생성 예시

public interface 인터페이스명 extends JpaRepository<Entity클래스, PK타입>{}


Spring에서 Bean을 주입받는 방식

1. @Autowired(비권장)

2. setter

3. 생성자(추천)

- Controller 상단의 @AllArgsConstructor(Lombok) 어노테이션을 통해 모든 필드를 인자값으로 하는 생성자를 대신 생성

-> 해당 클래스의 의존성 관계가 변경될때마다 생성자 코드를 계속해서 수정하는 번거로움을 해결!

※스프링 빈이란 자바 객체 :스프링 컨테이너에 의해서 자바 객체가 만들어 지게 되면 스프링에선 이 객체를 스프링 빈이라고 부른다.


Junit 별도 공부 필요


DTO생성 유의사항(?)

1. Controller에서 @RequestBody로 외부에서 데이터를 받는 경우엔 기본생성자 + set메소드를 통해서만 값이 할당되므로, DTO 생성시 setter를 허용

2. 절대로 테이블과 매핑되는 Entity클래스를 Request /Response 클래스로 사용해서는 안된다.

- 여기서는 Controller -> DTO -> Entity(인터페이스) 이런식으로 접근하는  걸 의미하는듯!