스프링부트 만들기

프로젝트구성

spring initializer 사이트에서 받는방법

name 
groupid : 패키지명을 바탕으로 시작
artifactID : 
version : 개발 버전 
descriptoin : 프로젝트 설명
packageName : 실제로 프로젝트에서 실행하는 루트 패키지 이름
type : 그래들 패키지
packaging : jar로 패키징
javaVersion : 자바 버젼
language : 자바
bootVersion : 스프링 부트 버전
dependencies = lombok&dependencies=h2&dependencies=data-jpa&dependencies=web

lombok

  • 자바 프로젝트 필수 라이브러리
  • 클래스에서 필수적으로 작성해야 하는 접근자 / 설정자

(Getter/setter), toString, equalAndHashCode, 생성자 등을 작성하지 않아도 된다

  • 코드를 간결하게 사용 할 수 있다.
  • 배포 버전을 확인하고 결합이 있는지 확인해야한다.
  • 사용시 주의사항
    롬복 버전 업데이트시에 약간 compile 필드 값을 잘못 가지고오면서, 오류가 나는 경우가 있음(권순남 작성 위키백과 )

h2 Databaese

  • 인메모리, 파일, TCP 지원 인터세이스
  • JDBC url 설정으로 데이터베이스 작동방식 지정가능
  • 스프링부트 자동구성으로 기본 제공, /h2-console h2 webconsole 제공
  • 로컬 개발환경에서 mysql…등 설치 없이, 별도의 DB 설치 없이 빠른 프로토타이핑 지원, 개발 베타에서는 설치해야함
    • 가능한이유 : JPA 쓰기 때문에 가능함, 쓰는 사람에 따라서
  • 필요에 따라 운영 가능한 수준의 데이터베이스 활용가능
    • 임베디드로 만들어서 쓰는 경우도 있음

프로젝트 구조

setting.gradle

rootProject.name = 'spring-boot'

  • 멀티 프로젝트 구성시 사용
  • 프로젝트 이름
  • 하위 프로젝트 정의 / include = ' law projectName '
  • 하위 프로젝트 설명()

gradle Wrapper

그래들 수동으로 받아야됬다. 빌드의 차이 때문에 오류가 나는 불편한점이 있었음

프로젝트 생성 후

gradley build 커멘드를 입력하게 되면

Gradle이 wrapper의 properties와 jar파일이 있는지 확인 한다 없으면,

gradle script에 의해서 gradle war 를 받고 jar 파일을 기준으로 빌드를 한다.

gradlew(.bat) clean build


스프링부트 어플리케이션

@SpringBootApplication
public class Application{
  public static void main(String[]args){
    SpringApplication.run(Application.class, args);
  }
}

스프링부트 자바 어플리케이션안에서 실행클래스를 통해 ioc 컨테이너를 띄우고 어노테이션이 있는 위치를기준으로 스프링 빌드를 탐색

Springapplication.run 코드를 보면 어노테이션 config …. 이런콘텍스트를 확인하기 보통은 web application으로 시작하게 된다.

보통은 servelt을 사용함 .(webMvcAutoConfiguration을 보면 됨)

해당 폴더 내에 들어가서 gradlew build 하면 springboot jar 파일이 만들어지고

플러그인에 의해서 만들어진 jar 파일은 fat war 라고도 하는데, 실행환경을다 포함해서 fat jar 라고 부름

프로젝트 밑에

build/libs/snapshot …이 됨

톰캣과 재압축됨

압축된것을 풀어보면

BOOT-INF/classes 내부

static : javascript, css , image

template : template 엔진, controller가 전달해주는 모델에서 동적으로 html 생성하는 것

META-INF : 메인 클레스가 뭐고 스타트가 어디인지 알수 있다.

실직적으로는 jar launcher가 실행되고 이후 메인 클래스가 동작하게 되는것

classes : dml 설정 파일과 application class 파일 존재 , lib : 의존성 라이브러리들

rootpackage를 기준으로

실행 : Java -jar spring-boot-snapshot-1.0.0


SpringApplication:: 스프링부트 앱 시작점

Spring-boot-starter

Spring-boot-dependencies

Spring-boot-autoconfigure

Spring-boot-parent

Spring-boot-starters

위의 순서대로 상속을 받아서 starters 가 만들어지고

아래의 pom.xml에 모듈들을 사용한다고 적어주면됨

autoconfiguration으로 작성되어 있음(자동구성이 어떻게 되어있는지 확인 가능)

Spring-boot-starter-*/pom.xml

servlet과 reactive로 보통 많이 쓰임

dispatcherServlet이 가장 중요한 역할을 함


@Component

스프링 프레임워크는

component라는 스트레오 타입 어노테이션을 기준으로해서

3가지의 하위 컴포넌트들로 나뉜다.

Controller, service, repository

@Bean vs @Component

빈 : 개발자가 제어할수 없는 다른이가 작성한 클래스들을 스프링 빈으로 등록

컴포넌트 : 내가 작성한 계열의 컴포넌트 클래스에다가 붙여 넣게 됨

트랜잭션이라고해서 데이터를 저장하고 관리를 할 경우 service라는 어노테이션을 사용하고

트랜젝션 필요 없는 경우 component 선언을 해서 많이 쓰임

빈 : 콩깍찌가 씌여져있는 객체라고 생각

spring ioc 콘테이너에서 생성, 소멸 되기 까지 생명주기를 관리하는것을 bean 객체 라고 함

객체중의 하나가 bean anotation이 적혀있는것


의존성 주입

라이브러리와 프레임워크의 차이

인스턴스를 만들때는 아래와 같이 라이브러리 객체를 만들어서 객체를문자열로 쭉 작성을 하면서 호출하게 되는 과정이 일반적

public class ObjectMapperTest{
  public void test() throws JsonProcessingException{
    ObjectMapper objectMapper = new ObjectMapper();

    Book book = new Book("test-book", "test-isbn13","test-isbn10");

    String strBook = objectMapper.writeValueAsString(book);
  }
  //검증 생략
}

하지만 스프링과 같은 ioc 컨테이너에서는 @autowired를 선언해놓으면 application context가 구동되는 상황에서 objectmapper를 이미 어딘가에서 읽어서 Spring bean으로 구성해놨기 때문에, 따로 인스턴스를 만들지않고 주입해야 할 수 있다.

public class ObjectMapperTest{
  @Autowired
  ObjectMapper objectMapper;

  public void test() throws JsonProcessingException{
    Book book = new Book("test-book", "test-isbn13", "test-isbn10");

    String strBook = objectMapper.writeValueAsString(book);
    //검증생략
  }
}

프레임워크가 제어의 역전함

프레임워크 쪽에서 필요한 컴포넌트를 가지고 있다가 필요한 곳에서 가져다쓰는 차이점

호출이 아니라 가져다쓰는 차이점


의존성 주입 방법

  • 생성자 주입( 권장)

    @Service
    public class BookServiceImpl implements BookService{
      private final BookRepository repository;
    
      public BookServiceImpl(BookRepository repository){
        this.repository = repository;
      }
    
      //코드 생략
    }

    생성자가 하나만 있어야 가능하다 autowired를 붙이지 않아도 service라느 어노테이션이 있어서, 스프링에서 아~ 내가 관리해야할 컴포넌트 이구나 라고 내가 가지고 있는 Book repository를 쓰네 라고 해서 주입이 됨.
    클래스에서 생성자가 하나만 있어야 사용 가능, @Service 컴포넌트에서 알아서 BookRepository라는 인스터스를 주입을 해줌

  • 설정자 주입( setter)

    @Service
    public class BookServiceImple implements BookService{
      private BookRepository repository;
    
      @Autowired
      public void setRepository(BookRepository repository){
        this.repository = repository;
      }
      //생략
    }

    파라미터 앞에 autowire를 설정하게 되면 사용이 가능함

  • 필드( @Autowired )선언

    public class BookServiceImpl implements BookService{
      @Autowired
      private BookRepository repository;
      //코드 생략
    }

    처음에는 @Autowired를 많이 쓰임

'BackEnd > SpringBoot' 카테고리의 다른 글

Spring Boot Logging (1)  (0) 2020.04.16
Request Body 의 값 BadRequest 로 보내기  (0) 2020.04.11
SpringBoot(4) -T-Academy  (0) 2019.05.24
SpringBoot(3)-T-Academy  (0) 2019.05.22
SpringBoot(2) -T-Academy  (0) 2019.05.21

+ Recent posts