[코드프레소 체험단] Spring Boot 웹 개발 입문

Dev_Sanizzang·2022년 2월 4일
0

코드프레소 체험단

목록 보기
9/10

이 글은 코드프레소 Java 웹 개발 체험단 활동 중 Spring Boot 웹 개발 입문 강좌를 기반으로 작성하였습니다.

코드프레소 URL: https://www.codepresso.kr/

강의 목차


먼저 강의 목차는 아래 그림과 같이 구성되어 있습니다.

Spring Framework 소개


Spring Framework 소개

Spring Framework는 Rod Johnson에 의해 개발 되었고 2004년에 1.0 버전이 출시 되었다.
Spring Framework은 웹 개발만을 위한 Framework는 아니지만, 주로 웹 애플리케이션 개발을 위해 활용된다. 작은 게시판과 같은 웹 애플리케이션부터 Netflix 수준의 대규모 애플리케이션을 개발하는 데 적용이 가능하다.

Spring Framework의 장점?

  • 경량화 된 Java Framework
  • POJO의 사용으로 재사용가능한 코드 개발 가능
  • DI와 AOP의 적용
  • Transaction 관리의 편의성
  • MVC 아키텍처의 지원
  • 테스트가 용이함
  • 높은 보안성

Spring Framework는 22개 카테고리의 수 백개의 프로젝트를 보유하고 있다. 대규모의 웹 애플리케이션 개발/운영을 위한 거의 모든 기술을 제공한다.
최근 SW 시스템은 점점 거대해지고 복잡해지고 있는데, 더 나은 SW 시스템을 위한 다양한 기술과 아키텍처가 소개 되고 있다.(마이크로서비스 아키텍처, NoSQL, 클라우드 컴퓨팅 및 컨테이너) 이에 Spring Framework는 변화하는 기술에 빠르게 대응하여 꾸준히 새로운 프로젝트를 출시한다.(Spring Cloud 프로젝트, Spring Native 등)

Spring Framework의 단점?

Spring Framework의 첫 번째 단점으로는 높은 러닝 커브를 들 수 있다. Bean, DI, AOP, 객체지향 설계, 디자인 패턴 등 다양한 개념 이해가 필요하다. Spring Framework은 엔터프라이즈 급 대규모 서비스 개발을 위한 목적으로 개발되었으며, SW의 유연한 확장성을 위해 다양한 기술들이 내포되어 있다.
Spring Framework의 두 번째 단점은 복잡한 설정이다. Spring Framework는 XML 지옥이라는 말이 나올 정도로 간단한 웹 애플리케이션 개발을 위해서도 상당한 수준의 설정이 필요하다. 이는 Spring Boot가 출시 되며 단번에 문제가 해결 되었다.(자동화 된 설정, 간편화 된 의존성 관리 등)

Spring Boot의 주요 기능?

  • 설정 간편화를 위한 Auto Configuration
  • 의존성 관리를 위한 Starter Project
  • 배포 프로세스 간소화를 위한 Embedded WAS
  • 애플리케이션의 모니터링을 위한 Actuator

웹 서비스 개발과 Web Framework의 이해

퍼블리싱 / 마크업 개발

  • 사용자에게 노출 되는 웹 화면을 개발
  • 디자인을 HTML/CSS 코드로 옮기는 과정
  • HTML, CSS를 주로 사용, Javascript 일부 사용
    - 화면의 정보와 구조를 나타내기 위해 HTML 사용
    • 화면의 스타일을 꾸미기 위해 CSS 사용
    • 사용자 이벤트를 처리하기 위해 Javascript 사용

프론트엔드 개발

  • 사용자 화면과 백엔드(DB)와의 중간 커뮤니케이션 역할
  • 사용자의 입력/이벤트를 받아 백엔드로 전송
  • 백엔드의 데이터를 받아 화면에 노출
  • Javascript, Jquery 등이 전통적으로 많이 사용 됨
  • 최근에는 VueJS, ReactJS, AngularJS 등의 프론트엔드를 위한 Framework등이 많이 사용 됨

백엔드 개발

  • 웹 서비스의 비즈니스 로직을 처리하는 부분
  • 브라우저에서의 사용자 요청을 받아 적절하게 처리
    - 로직 처리
    • DB 연동
    • 외부 시스템 연동(Mail, CRM 등)
  • Spring, Django, Flask, NodeJS 등의 Web Framework를 활용하여 개발

DB 설계/운영

  • 웹 서비스의 데이터가 저장 될 DB 설계하고 DBMS를 운영 관리
  • 데이터는 웹 서비스의 가장 중요한 요소 중 하나
  • DB 분석/설계와 DBMS 운영은 다른 역할
  • RDBMS로는 Oracle, MySQL, PostgreSQL, MSSQL 등이 주로 사용
  • NoSQL로는 MongoDB, Cassandra, DynamoDB, Elasticsearch 등이 주로 사용

시스템 엔지니어링, 인프라 엔지니어링

  • 웹 서비스가 운영 될 기간 인프라를 설계하고 운영
  • 서버, 네트워킹, 스토리지, 보안 등 설계, 구축, 운영
  • 기존에는 온 프레미스 기반의 시스템 운영
  • 최근에는 클라우드 및 컨테이너 기반의 시스템 운영으로 전환 중
    - AWS, Azure, GCP, NCP ...
    • Docker, Kubernetes

SW Framework?

  • SW 개발을 효율적으로 하기 위한 반제품
  • 특정 분야의 SW 개발에 필요한 공통 기능을 제공
  • 사용자는 Framework에 필요한 기능을 추가하여 전체 애플리케이션을 완성

실습 환경 구성


나의 첫 Spring Boot Application

Spring Boot 애플리케이션 개발 및 실행 순서

  1. spring initializr를 활용한 Spring Boot 프로젝트 생성 및 다운로드
  2. 다운로드 한 Spring Boot 프로젝트를 IntelliJ에서 Import
  3. 추가 코드 개발
  4. Spring Boot 애플리케이션 실행
  5. 웹 브라우저 또는 Postman을 활용하여 테스트

Web의 기초 개념과 HTML의 기초 활용


Web과 HTTP의 이해

Web(World Wide Web)이란 인터넷 상에서 정보를 공유하는 기술 중 하나이다. Web에서의 정보는 기본적으로 Hyper Text 문서로 작성 되고 공유 된다.(Hyper Text를 작성하는 언어가 HTML) Web Browser는 원격에 있는 Hyper Text문서를 읽어서 사람이 보기 좋게 만들어 주는 프로그램이다.

Hyper Text는 일종의 문서로, 링크를 포함하고 있어 다른 문서들과 연결 될 수 있다.
모든 문서는 고유의 주소를 갖고 있다.

HTML(Hyper Text Markup Language)

Hyper Text(웹 페이지)를 작성하기 위한 언어로 웹페이지의 구조를 결정하고 각 요소들의 의미를 부여한다.

HTTP(Hyper Text Transfer Protocol)

Hyper Text(웹 페이지)를 컴퓨터가 주고 받기 위한 규약으로 컴퓨터 간의 데이터를 주고 받기 위해서는 명확한 약속이 필요하다. IETF, W3C 등의 국제 표준 단체에서 HTTP에 대한 표준을 정하여 배포한다. 모든 브라우저에 웹 서버 등은 HTTP 표준에 따라 개발 되고 통신한다.

IP와 Port의 개념

IP주소는 인터넷에 연결 된 기기가 가질 수 있는 네트워크 상의 주소를 말한다. IP 주소 정보로 원격에 있는 자원(웹 페이지, 이미지 등)을 요청 가능하다.

IPv4 vs IPv6

  • IPv4는 전 세계적으로 2^32개의 IP주소가 가능, 기기의 증가로 고갈 예정
  • IPv6는 2^128개의 IP 주소가 가능

공인 IP 주소는 인터넷 상에 고유한 IP주소다. 공인 IP 주소는 IP 주소를 관리하는 기관으로부터 할당 받아 사용가능하며 대륙별, 국가별 할당 받은 공인 IP 주소가 존재한다. 누구나 접속 가능해야 하는 웹 서버 등은 공인 IP 주소가 필요하다. 그에 반한 사설 IP는 특정 조직 내부에의 사설 네트워크 안에서만 통신 가능한 IP 주소이다. 사설 네트워크 내부에서는 사설 IP로 통신이 가능하나, 외부에서는 사설IP로 기기에 접근이 불가능하다. 사설 네트워크 간에는 사설IP가 중복되어도 무방하다.

호스트명(Hostname)

긴 숫자(일부 문자) 형태의 IP주소는 외워서 활용하기가 어렵다. 이와같은 IP 대신 사람이 읽고 외우기 쉬운 형태의 주소가 필요 했는데 이를 위해 호스트명이 탄생했다. 호스트는 인터넷 상에 IP 주소를 가진 기기를 의미하며 호스트명으로 기기의 IP주소를 찾을 수 있다.

localhost

현재 작업을 수행 중인 기기를 지칭하는 특수한 호스트 명으로 IP 주소로는 '127.0.0.1'로 표현한다.

Port 주소

IP 주소가 특정 호스트(기기)까지의 주소라면, Port는 호스트 내부의 프로세스의 네트워크 주소이다. Port 주소는 호스트에서 0 ~ 65,535까지 사용 가능하며 호스트 내부에서 Port 주소는 유일해야 한다.

HTML의 이해

  • Hypertext -> 서로 연결 될 수 있고
  • Markup -> 정보를 구조적으로 표현하는
  • Language -> 프로그래밍 언어

CSS 기초개념

  • HTML 태그의 한계를 극복하기 위한 기술
  • HTML은 정보를 표현하는데 집중하고,
  • CSS는 HTML 문서를 시각적으로 꾸미는 기능에 집중하는 기술
  • 정보와 디자인을 분리할 수 있다.
  • 정보를 수정하지 않고 디자인만 변경할 수 있다.
  • CSS(Cascading Style Sheets)

Spring Boot 컨트롤러와 REST API


계층형 아키텍처의 이해

건축을 할 때 설계도를 그려서 건물이 어떻게 지어질지 구성하는 것처럼 SW도 실제 코드 개발 전에 최종 SW가 되어야 할 모습을 설계한다. SW 아키텍처란, SW의 구조를 정의한 것으로 SW를 구성하는 주요 요소들과 요소들의 관계를 정의한 것이다.

컨트롤러의 구현 문법

Spring Controller

  • 계층형 아키텍처의 Presentation Layer에 해당
  • Client(웹 브라우저, 모바일 앱)의 요청을 받고
  • Application Layer에 요청에 대한 처리를 위임하며
  • Client에 최종 응답을 하는 역할
    - view: Client가 요청에 대한 응답의 결과로 보게 되는 웹 페이지
    • data: Client가 요청에 대한 응답으로 받는 데이터

Controller 코드

  • Spring Controller를 구형하기 위해서는 3개의 기본 Annotation이 사용 됨
  • @Controller와 @ RestController
    - Controller 역할을 하는 클래스를 지정, 클래스 상단에 명시
  • @RequestMapping
    - 특정 Request를 처리하는 메소드를 지정, 클래스 또는 메소드 상단에 명시

Framework 활용은 규칙을 지키는 것이다. 약속 된 Annotation들을 Spring Framework에서 스캔한다. Annotation이 부착 된 코드들은 Spring Framework에 의해 관리 되며, Spring Framework에 의해서 특정 한 목적으로 사용된다.

Annotation?

  • Java 소스코드에 추가적인 정보를 제공하는 방법
  • @으로 시작하며 클래스, 메소드, 멤버변수, 파라미터 등에 부착 가능
  • 3가지 유형의 Annotation
    - 자바 컴파일러에게 정보를 제공(에러 등을 찾아내기 위해)
    - SW 툴에 의해 사용되어 코드 생성이나 추가 작업을 진행
    - run-time 시 특정 동작을 추가적으로 실행

@Controller vs @RestController

  • 대부분의 동작은 유사
    - 요청을 받아서 처리하고 응답을 한다
  • 응답하는 형태가 다름
    - Controller: view를 응답(html 파일 등)
    • RestController: data를 응답(문자열, Json, xml 등)

RequestMapping과 URI

RequestMapping이 붙어 있는 메소드는 Client의 특정 요청이 왔을 때 Spring Framework에 의해 호출 된다.

URI(Uniform Resource Identifier)

  • URL과 유사한 개념
  • 특정한 자원에 접근 하기 위한 이름 또는 주소
    - https://www.google.com
  • 웹 상의 모든 자원들은 URI를 갖고 있음
    - 웹 페이지
    • 이미지
    • 영상

Spring Controller의 메소드들은 URI에 따라 호출이 결정된다. 기본 도메인에 이어지는 '/path'들에 의해 결정된다. @RequestMapping Annotation에 URI Path 정보를 명시한다.(@ RequestMapping(value = "/user"))

단일 웹 애플리케이션 내에서 URI는 중복될 수 없다.

네이밍 규약

  • 소문자를 사용
  • 요청하는 자원에 대한 명사 형태로 작성
  • 두 단어 이상 연결 될 경우 '-'를 사용
  • 의미있는 이름으로 일관성 있게 작성

HTTP API의 개념

Interface란 두 개체 간의 정보를 공유하기 위한 방법(규약)이다. 그중에서 API(Application Programming Interface)는 컴퓨터(프로그램)간의 정보를 공유하기 위한 방법 이다.

  • 함수나 메소드를 호출하는 형식의 API
  • HTTP등의 기술로 네트워크를 통한 원격 자원을 호출하는 API

HTTP API vs REST API

  • HTTP(S)를 활용하여 원격의 데이터를 공유하기 위한 API

Request 파라미터의 이해

Request 파라미터는 Client가 Server에 요청(Request)를 할 때 추가적으로 전송하는 데이터이다. 예를 들어 Query String, Path Parameter 등이 있다. Spring Framework는 Request 파라미터를 메소드의 파라미터에 저장한다.

Request 파라미터 - Query String의 활용

  • 메소드 파라미터에 @RequestParam Annotation 사용
  • name 요소는 Query String에 key에 매핑 됨
  • RequestParam의 요소들
    - name: query string의 key, key와 변수명이 같을 경우 생략 가능
    - required: 필수 여부
    - defaultValue: 데이터가 없을 경우 기본 값

Request 파라미터 - Path Parameter

  • @RequestMapping value URI에 {}로 Path Param임을 표시
  • 메소드 파라미터에 @PathVariable Annotation 사용
  • 선택적 데이터의 경우에는 Path Param을 잘 사용하지 않음

Query String vs Path Parameter

  • 일반적인 추천 사항
    - 특정 자원을 요청 하는 경우는 Path Param을, 정렬이나 추가 필터링을 위한 데이터는 Query String 사용
  • 필수 데이터는 Path Param으로 선택적 데이터는 Query String 사용
    - Path Param이 포함 된 URI는 Client가 영향을 받기 때문에 변경 비용 높음
    • Query String은 상대적으로 편하게 확장 가능
  • 조직(회사 또는 팀)마다 표준이 존재하고, 표준에 따라 개발

Response 데이터와 JSON 포맷의 이해

JSON 응답 데이터란 웹 개발 시 가장 일반적으로 사용하는 응답 데이터 포맷이다. 프론트엔드에서는 JSON 형식의 데이터를 응답 받아 화면을 구성한다. 각 REST API 별로 어떤 JSON 데이터를 응답할 것인지 사전에 정한다.

JSON?

  • JSON - JavaScript Object Notation
  • JSON은 데이터를 교환하는 데 사용
  • 기존의 방법(XML) 보다 가벼움
  • XML에 비해 상대적으로 사람이 읽고 이해하기가 쉬움

Spring Boot에서는 객체를 반환하면 적절한 JSON 형식으로 변환하여 Client로 최종 응답 한다.

HTTP Method의 이해

HTTP Method란 HTTP 규약 중 하나로, 특정 자원에 대해 수행하는 행동의 종류를 명시한다.

주로 사용 되는 HTTP Method

  • GET
  • POST
  • PUT
  • DELETE

HTTP Method의 구현

  • @RequestMapping의 요소로 Method를 명시
  • 요청 된 HTTP Method에 따라 해당 Controller의 Java 메소드를 호출
  • 각 Java 메소드에서는 HTTP Method에 해당하는 처리를 수행하도록 설계 하는 것이 권장 됨\

아래 그림과 같이 HTTP Method를 위한 간소화 된 Annotation도 있다.

Request Body

  • 일반적으로 데이터를 저장 및 수정하는 POST, PUT Method에서 사용 됨
  • Request Body에 다양한 포맷의 데이터 전송 가능
    - JSON 데이터 형식이 주로 사용 됨
  • Client에서는 JSON 데이터를 전송하고, Spring에서는 JSON 데이터를 Java 객체 파라미터로 저장

REST API 문서의 활용

API는 정보를 주고 받기 위한 방법/약속이다. API를 사용하기 위해서는 사용 방법을 알아야 한다.

REST API 문서가 담고 있어야 하는 정보

  • REST API 설명
  • URI
  • HTTP Method
  • Request 파라미터(필수 파라미터와 선택 파라미터)
  • Response 데이터(필수 응답 데이터와 선택 응답 데이터)
  • 가능한 에러 코드 및 대응 방법

REST API 문서의 활용

  • 프론트엔드 개발자와 백엔드 개발자 모두 REST API 문서를 읽고 이해할 수 있어야 함
  • 백엔드 개발자는 프론트엔드 등의 Client를 위해 REST API 문서를 작성 할 수 있어야 함
  • REST API 문서가 잘 작성 될 수록 Communication 비용이 줄어 듦

Spring Bean의 개념과 의존성 주입


Spring 서비스 계층의 이해

Spring Service 계층은 시스템의 핵심 비즈니스 로직을 구현하는 계층이다. view의 종류와 database의 종류에 영향을 받지 않는 독립적인 계층으로 영향을 받지 않도록 설계 해야 한다.

Service의 구현

  • 클래스에 @Service Annotation 사용
  • 파라미터로 전달 된 데이터들의 검증 작업 수행
  • Repository 계층을 활용하여 database에 접근
    - Service 계층의 단일 메소드가 transaction의 단위가 됨
  • 애플리케이션의 세부 영역(User, Post, ..) 별로 클래스를 생성하여 구현
  • 인터페이스의 사용이 권장 되나 다형성을 활용한 기능 확장의 요구사항이 없는 경우 사용하지 않기도 함

스프링 빈과 의존성 주입

의존성(Dependency)이란 하나의 모듈(클래스, 패키지 등)이 다른 모듈을 사용하는 것이다.
일반적으로 다른 객체의 기능을 사용하기 위해서는 멤버 변수에 new로 객체를 생성하여 참조한다. 어떤 객체를 생성하여 사용할 것인지 코드 상에 명시한다. (compile-time 의존성이 생성 됨)

의존성 주입(DI, Dependency Injection)

  • 객체 생성을 외부에서 대신 수행
  • 활용할 객체에 대한 의존성(참조)설정을 외부에서 대신해 줌
  • 활용할 클래스(인터페이스)타입의 멤버 변수만 선언 후 생성자 구현
    - new 키워드로 객체 생성 직접 하지 않음

Spring Framework가 객체의 생성과 관리 역할 수행

  • Spring Framework가 특정 조건을 만나면 객체를 생성
    - 클래스 상단의 Annotation(@Controller, @RestController, @Service 등)
    • @Configuration 클래스의 @Bean Annotation
    • XML 설정
  • 객체로 생성할 대상을 검색하는 과정 -> Component Scan
  • 조건에 따라 객체들의 의존성을 관리

Spring IoC 컨테이너와 Spring Bean

  • Spring IoC 컨테이너
    - Spring Framework에서 객체의 생성과 관리의 역할을 하는 컴포넌트
  • Spring Bean
    - Spring IoC 컨테이너에 의해서 생성되어 관리되는 Java 객체

의존성 주입을 위한 단계

  1. Spring에 의해 객체가 생성 되게끔 Annotation 설정
  2. 사용할 객체를 멤버 변수와 생성자에 추가
  3. 객체를 사용한다.

@Configuration과 @Bean Annotation

  • Java 클래스에 @Configuration Annotation을 사용 가능
    - 해당 클래스는 Spring Framework에 의해 설정 정보를 위한 클래스로 활용 됨
  • @Configuration 클래스 내에 @Bean을 사용한 메소드로 Bean 생성 가능
    - Bean으로 등록할 객체를 생성 후 Return
profile
기록을 통해 성장합니다.

0개의 댓글