네이버클라우드 캠프 5기/학습내용 정리

55. SpringBoot - SpringBoot란?

박세류 2023. 6. 21. 11:07

1. Spring Boot

1. Spring Boot란

1. SpringFramework 기반으로 tomcat이 내장되어 있으며 다양한 라이브러리 및 어노테이션이 추가된 프레임워크.(@RestController, @Configuration, @Mapper, @Bean, ...)

2. Spring Boot의 특징

1. tomcat이 내장되어 있어 별도의 tomcat 설치가 필요없다.

2. Spring Framework 프로젝트의 배포는 WAS에서 읽을 수 있는 WAR 파일로 만들어서 배포를 진행했는데 Spring Boot 프로젝트는 JDK에서 바로 실행할 수 있는 JAR 파일로 만들어서 배포

3. Spring Boot Starter 패키지를 제공해서 빠른 라이브러리 의존성을 설정할 수 있다.

4. Spring Boot 프로젝트에는 메인 메소드를 가지고 있는 클래스가 존재하기 때문에 jdk에서 바로 실행가능하다.

5. 메인 메소드를 가지고 있는 클래스에는 @SpringBootApplication이라는 어노테이션이 선어되어 있다. @SpringBootApplication 어노테이션은 현재 프로젝트가 스프링 부트 웹 프로젝트이며 웹 어플리케이션으로 구동되도록 해주는 어노테이션.(즉, 내장된 tomcat을 구동시키는 기능을 포함). 그리고 프로젝트에 선언되어 있는 @EnableAutoConfiguration, @Configration, @Component(@RestController, @Service, @Mapper, @Repository, ...), @Bean 어노테이션을 읽어서 각각 처리할 수 있는 기능도 포함되어 있다.

6. Spring Boot에서는 API 위주의 백엔드 개발(요청 url을 호출하면 데이터만 리턴되는 형태의 개발)이 진행된다. 기존 컨트롤러 클래스를 @RestController로 선언하여 응답 바디에 html을 보내는 것이 아니고 메소드의 리턴값을 그대로 담아서 전송한다(JSON형태로). @RestController에서는 Map이나 DTO객체를 리턴하면 JSON형태로 자동 변환되어 리턴. @RestController = @Controller + @ResponseBody

3. API(Application Programming Interface)

1. API 란 Application 제조사에서 제공하는 Application에 대해 설명하는 공식 문서 또는 Applcation을 사용할 수 있도록 제공되는 서비스의 표준(어떤 파라미터를 전송해야되고 어떤 결과값이 리턴되어 오는지에 대한 명세서가 필수적으로 만들어져야 함-API 명세서).

2. API 명세서: API로 사용될 서비스에 대한 설명. API 요청주소, 요청파라미터(필수값과 필수가 아닌 값 구분하여 작성), 결과 값이 리턴되는 형식을 답고 있는 문서.

3. 스마트폰이나 태블릿 PC가 나오기전 데스크탑만 존재하던 시절에는 API는 오직 데스크탑 스펙에만 맞춰서 제작됐다. 거의 모든 API가 모니터 크기의 해상도에 맞춰서 제작되고 그냥 html자체를 보내주는 형식이 많았다.

4. 하지만 스마트폰과 태블릿 PC가 등장하면서 API를 호출하여 사용하면 스마트폰이나 태블릿에서는 깨지거나 짤려서 표출되는 경우가 발생하면서 REST API(Represtational State Transfer API)라는 개념이 등장했다. 화면크기와 상관없이 호출해도 문제가 발생하지 않는 API에 대한 개발이 이뤄졌고 html를 리턴하는 것이 아닌 데이터를 리턴하여 화면 개발자들이 알아서 표출하게 하는 형식의 API가 탄생했다. 초창기에는 xml형식의 데이터를 많이 사용했는 데 요즘은 json형태의 데이터를 많이 사용한다.

5. RESTful API

  1. 그냥 데이터만 리턴한다고 RESTful API라고 부르지는 않는다. RESTful API는 몇 가지 원칙이 있는데 그 조건을 만족해야 RESTful API라고 부르게 된다.

    • Uniform Interface: 데이터를 식별 가능하게 해야한다는 원칙. url만 보고도 어떤 데이터를 어디로 전송하는 지 알아야 한다는 것이다.
      http://locahost:8090/board/insertBoard.do?boardNo=1
      //boardNo=1인 데이터 입력
    • Client Server: 클라이언트와 서버는 분리되어 있어야 하며 클라이언트는 서버로 요청을 보내고 서버는 클라이언트에게 요청에 대한 응답을 보내줘야 한다는 원칙.
    • Statless: Http 프로토콜을 사용해서 전송하기 때문에 상태를 저장하지 않으면 요청에 대한 모든정보가 한번에 담겨서 전송돼야 한다.
    • Cacheable: 요청을 통해서 전송되는 자료(정적 파일(image, css, js, html, ...))들은 저장되어야 한다. 브라우저 캐시메모리에 저장되어서 다시 접속했을 때 자료를 읽는 속도가 빨라져 전체적인 접속 시간이 줄어든다.
    • Layered System: 요청된 정보를 검색하는 것은 계층구조로 분리되어 있어야 한다. 중간에 중간 서버를 하나 만들어서 서버 확장성을 확보한다.
    • Code On Demand: 기본적으로 Xml/Json으로 리턴하는 게 원칙이지만 필요한 경우 코드 자체를 클라이언트에게 리턴할 수 있어야 한다.
  2. RESTful API의 URL 네이밍 규칙

    • 명사를 사용한다.

      @PostMapping(insertBoard)  (x)
      @PostMapping(insert-Board) (x)
      @PostMapping(insert_Board) (x)
      
      @PostMapping(board)   (o)
      @GetMapping(board)    (o)
      @PutMapping(board)    (o)
      @DeleteMapping(board) (o)
    • 소문자를 사용한다.

      @PostMapping(Board)   (x)
      @PostMapping(board)   (o)
    • 복수형을 사용한다.

      @PostMapping(board)   (x)
      @PostMapping(boards)   (o)
    • 구분자는 하이픈('-')을 사용한다.

      @PostMapping(boardFile)    (x)
      @PostMapping(board_file)   (x)
      @PostMapping(board-file)   (o)
    • 마지막에는 슬래쉬(/)를 넣지 않음

    • 파일 확장자(.json)는 포함하지 않는다.

  3. RESTful의 규칙은 아니지만 지켜져야 하는 것들

    • 한 어플리케이션에서의 API는 모든 데이터를 동일한 형태로 리턴해야 한다.
    • 리턴되는 데이터에는 항상 요청 상태값(200, 404, 400, 500, ...), 에러메시지, 데이터를 담아주는 키 값등이 포함되어야 한다.
    • ResponseEntity라는 Spring Boot에서 제공하는 객체를 통해서 같은 형태로 리턴되는 RESTful API를 개발할 수 있다.

      6. MSA(Micro Service Architecture) 특화

  4. MSA는 기능별로 어플케이션을 분리하는 아키텍쳐인데 스프링부트는 API의 기능을 주로 하기 때문에 기능별로 분리하기 매우 편한 장점이 있다.

  5. 넷플릭스의 성공에 따른 MSA가 엄청나게 유행하고 있기 때문에 MSA는 서비스 구축에 필수적인 요소로 자리잡고 있다.

  6. MSA도 서비스를 너무 작게 구성하게 되면 서비스가 너무 많아져서 어플리케이션 자체가 복잡해지는 문제가 발생하기 때문에 적당한 서비스 개수를 조절하는 것이 중요하다.

3. Spring과 빌드 툴(Maven, Gradle, Ant)

1. 빌드도구의 역할: 빌드도구의 역할은 프로젝트 내의 파일들을 모두 패키징해서 WAS가 인식할 수 있는 파일로 묶어주는 역할. 위 기본적인 기능과 의존성관리(라이브러리 자동 설치-pom.xml), 버전 동기화 등의 기능도 제공.

2. Ant: Servlet/JSP 프로젝트에서 사용되던 빌드 도구. build.xml 파일에 빌드규칙이나 의존성을 관리규칙을 지정. 빌드규칙은 항상 순차적으로 진행되기 때문에 빌드규칙 순서를 항상 맞춰서 작성해야된다. 의존성 관리도 해주긴 하지만 온라인 다운받는 것이 아니고 개발자가 직접 다운받은 라이브러리를 절대경로로 넣어줘야 했다. 외부 라이브러리 참조가 불가능했기 때문에 점점 다른 빌드 도구를 사용하게 됐다. 요즘에는 업데이트가 계속 돼서 외부 라이브러리 참조도 가능한 상태.

3. Maven: Ant 빌드 도구의 단점을 보완한 빌드도구. 외부 라이브러리 참조가 가능한 빌드 도구. Spring Framework의 기본 빌드 도구로 지정. pom.xml을 통한 라이브러리(의존성) 관리가 가능했고 개발자들로부터 많은 지지를 받았는데 xml 특성상 코드가 길어지면 가독성이 매우 떨어지는 특징이 있기 때문에 pom.xml 자체가 단점으로 전락했다.

4. Gradle: xml의 단점을 보완하기 위해서 groovy언어를 설정파일로 채택하여 라이브러리 관리 또는 빌드 규칙을 groovy언어로 관리. xml에 비해서 설정 파일의 길이가 매우 짧고 간략하다. build.gradle 파일에 의존성 관리, 빌드, 빌드의 생명주기, 버전관리 등을 설정할 수 있다.

728x90