[0] Spring
[1] Web ( World Wide Web ) 이란
인터넷 상 정보 공유 기술 중 하나로 , Web에서의 정보는 Hyper Text 문서(html등) 로 작성되고 공유 된다.
Web brower는 Hyper text 문서를 읽어 사람이 보기 좋게 만들어주는 프로그램을 의미한다.
Hyper Text란 일종의 문서로, "링크를 포함하여" 다른 문서들과 서로 연결 된 문서를 의미한다 ( 웹 페이지 )
[2] HTTP ( Hyper Text Transfer Protocol )
Hyper Text (웹 페이지)를 컴퓨터가 주고 받기 위한 규약이다.
모든 브라우저와 웹 서버는 HTTP 표준에 따라 개발되고 정보를 주고 받는다
[3] Client 와 Sever의 기본 동작 구조
Cilent 가 Server에 요청을 하면 , Server는 요청에 대한 처리를 한 후 결과를 응답함
Server는 요청에 대한 처리를 한 후 결과를 응답한다.
- 단순 문자열, 이미지, 영상, HTML, JSON 등 ..
[1] SPRING FRAMEWORK
Rod Johnson에 의해 개발되어 2004년 1.0 버전이 출시됨
2017년 5.0 , 2014년에 1.0 , 202 0년 Spring Boot 2.x 출시 됨
주로 웹 애플리케이션 개발을 위해 활용되고 작은 게시판부터 Neflix 수준의 대규모 애플리케이션을 개발하는 데 작용
국내외 많은 기업들이 Spring Framework을 핵심 기술로 활용 중이다.
Spring Framework의 장점
- 경량화 된 Java Framework
- POJO의 사용으로 재사용가능한 코드 개발 가능
- DI와 AOP의 적용
- Transaction 관리와 편의성
- MVC 아키텍처의 지원
- 테스트 용이 & 높은 보안성
- 방대한 프로젝트
- Spring Framework은 22개 카테고리의 수 백개의 프로젝트를 보유
- 대규모의 웹 애플리케이션 개발/운영을 위한 거의 모든 기술 제공
- 끊임없는 개선
- 최근 SW 시스템은 점점 거대해지고 복잡해지고 있음
- 더 나은 SW 시스템을 위한 다양한 기술과 아키텍처가 소개되는 상황
- 마이크로 서비스 아키텍처
- NoSQL
- 클라우드 컴퓨팅 및 컨테이너
- Spring Framework는 변화하는 기술에 빠르게 대응해 새로운 프로젝트 출시 중
- Spring Cloud 프로젝트, Spring Native 등..
Spring Framework 단점
- 높은 러닝커브
- Bean, Di, AOP, 객체지향 설계, 디자인 패턴 등 다양한 개념 이해 필요
- Spring Framework은 대규모 서비스 개발을 위한 목적으로 개발
- SW의 유연한 ㅎ확장성을 위해 다양한 기술들이 내포되어 있음
- 복잡한 설정
- "Spring Framework는 XML의 지옥이다"
- 간단한 웹 애플리케이션 개발을 위해서도 상당한 수준의 설정이 필요함
- Spring Boot가 출시 되어 단번에 문제가 해결 됨
- 자동화 된 설정, 간편화 된 의존성 관리 등
Spring Boot
- 일반적인 스프링 프레임 워크보다 손쉽게 활용할 수 있게 지원하는 기술이다.
- Spring Framework를 기반으로 된 프로젝트이다.
- 설정, 의존성 관리, 애플리케이션 모니터링, 서버의 실행 등을 가볍고 빠르게 수행 가능
- Spring Boot의 주요 기능
- 설정 간편화 - Auto Configuration
- 의존성 관리 - Starter Project
- 배포 프로세스 간소화 - Embedded WAS
- 애플리케이션 모니터링 - Actuator
웹 서비스 개발 및 운영 직군
- 퍼블리싱, 마크업 개발
- 사용자에게 노출되는 웹 화면 개발
- 디자인을 HTML/CSS 코드로 옮기는 과정
- 프론트엔드 개발
- 사용자의 입력/이벤트를 백엔드로 전송
- 백엔드의 데이터를 받아 화면에 노출
- JS. Jquery, VusJS, ReactJS 등 Framework로 사용
- 백엔드 개발
- 웹 서비스의 비지니스 로직을 처리하는 역할
- 브라우저에서의 요청을 적절하게 처리
- 로직 처리, DB연동, 외부 시스템 연동DB 설계, 운영
- DB설계/운영
- 웹 서비시의 데이터가 저장 될 DB 설계 DBMS 운영 관리
- DB 분석/설계와 DBMS 운영은 다른 역할
- RDBMS - Oracle, MySQL, MSSQL 등이 사용
- NOSQL - MongoDB , Cassandra, DynamoDB 등이 사용
- 시스템 엔지니어링, 인프라 엔지니어링
- 웹 서비스가 운영 될 기간 인프라를 설계하고 운영
- 서버, 네트워킹, 스토리지 보안 등 설계, 구축, 운영
- 기존 = 프레미스 기반 , 최근 = 클라우드 및 컨테이너 기반
웹 프레임워크
Web Framework 종류
- Spring - Java
- Flask , Django - Python
- NodeJs - Javascript
- Laravel - PHP
- Rails - Ruby
SW Framework
- SW 개발을 효율적으로 하기 위한 반제품
- 특정 분야의 SW 개발에 필요한 공통 기능을 제공한다.
- 사용자는 Framework에 필요한 기능을 추가하여 전체 애플리케이션 완성
Postman
- REST API 통합 관리하기 위한 SW
- Spring Boot로 구현하는 API를 테스트하기 위한 용도로 사용
[2] Spring Boot 컨트롤러와 REST API
1. 계층형 아키텍처란 ?
[1] SW 아키텍처 → SW의 구조를 정의한 것으로 SW를 구성하는 주요 요소들과 요소들의 관계를 정의
[2] 디자인 패턴 → 특정 상황의 문제를 해결하기 위한 일반화된 솔루션을 의미함
계층형 아키텍쳐 패턴
웹 서비스 개발에 주로 사용되는 패턴으로 서로 다른 역할의 SW를 3~4개 계층으로 구분함.
계층 간 호출을 하며 데이터를 주고 받아 협력하여 전체 웹 서비스를 구성한다.
- Presentation Layer -> 사용자의 요청과 응답
- Application Layer -> 특정 목적의 비지니스 로직 처리
- Business Layer
- Data Access Layer -> DB에 접근해 데이터 저장,조회
[2] Spring Controller
- Spring Controller는 계층형 아키텍처의 Presentation Layer에 해당
- Clinet의 요청을 받고 Application Layer에 요청에 대한 처리를 위임하고, Client에 최종 응답을 하는 역할
- (응답1 ) View : Client 응답의 결과로 보게 되는 " 웹 페이지 "
- (응답2 ) Data : Client 응답의 결과로 받게 되는 " 데이터 "
- Spring Controller를 구현하기 위해 3개의 기본 Annotation이 사용됨
- @Controller - 컨트롤러 역할의 클래스 지정 < 응답 형태가 View의 형태 >
- @RestController - 컨트롤러 역할의 클래스 지정 < 응답 형태가 Data의 형태 >
- @RequestMapping - 특정 요청을 처리하는 메소드를 지정
- Framework 활용은 규칙을 지키는 것으로 Spring 프레임워크의 규칙을 지켜야 함
- 약속된 Annotaion들은 Spring Framework가 스캔하게 되고 관리된다.
- 관리되는 Annotation은 Spring Framework에 의해 특정 목적으로 사용된다.
Annotation < @ >
- Java 소스코드에 추가적인 정보를 제공하는 방법
- @로 시작해서 클래스, 메소드, 멤버변수, 파라미터 등에 부착이 가능하다
- 3가지 유형의 Annotation이 존재함
-------------------------------------------------------------------
<1> 자바 컴파일러에게 정보를 제공하는 역할
<2> SW 툴에 의해 사용되어 코드 생성이나 추가 작업을 진행하는 역할
<3> run-time 시 특정 동작을 추가적으로 실행하는 역할
@RestController VS Controller
- 대부분의 동작 유사
- 요청을 받아서 처리하고 응답을 반환함
- 차이점은 응답 형태 !
- Controller : view를 응답 ( html 파일 등 )
- RestController : data를 응답 ( 문자열, json, xml 등 )
@RestController public class HelloController { @RequestMapping(value = "/hello") public String hello() { return "hello"' |
@Controller public class HelloController { @RequestMapping(value = "/hello") public String hello() { return "hello"; |
hello라는 문자열이 웹에 표시되게 된다 | hello라는 html 문서 혹은 템플릿 엔진 등을 사용해서 표시한다. View의 파일을 응답함 ! |
@RequestMapping
특정 요청을 처리하는 메서드를 지정
- RequestMapping이 붙어 있는 메소드는 Client의 특정 요청이 왔을 때 Spring Framework에 의해 호출된다.
- 즉 Spring Frameworks는 @ReqeustMapping Annotation을 인식해서 특정 요청을 처리할 메소드를 관리한다.
- 기본 도메인에 이어지는 URI path 정보를 기반으로 Clinet 요청을 특정 메소드에 전달한다.
- 예시 URI는 아래와 같다. ( " URI/hello" , "URI/bye" ) => hello, bye : 클라이언트 요청
아래 코드는 유저가 hello, bye 요청을 했을 경우 처리되는 특정 메소드를 의미한다.
@RestController
public class HelloController {
@RequestMapping(value = "/hello")
public String hello() {
return "hello";
}
@ReqeustMapping(value = "/bye")
public String bye() {
return "bye";
}
}
URI (Uniform Resource Identifier )
자원의 주소를 의미하고 계층적으로 표현하는 것이 가능한 주소체계
- URL과 유사한 개념
- Uniform Resource Locator 로 URI의 하위 개념
- 특정한 자원에 접근 하기 위한 이름 또는 주소를 의미한다
- https://www,google.com
- https://www.codepresoo.kr/subscribe
- 웹 상의 모든 자원들은 URI를 가지고 있음
- 웹 페이지, 이미지, 영상 등...
- URI는 요청히는 자원의 종류에 따라 이름을 정한다
- www.codepresso-blog.com/user
- URI는 계층 관계로 표현 가능하고, '/'로 계층을 구분한다.
- www.codepresso-blog.com/user/enterprise/google
- 단일 웹 애플리케이션 내에서 URI는 중복 될 수 없고, 중복 시 에러 발생
- 네이밍 규약이 존재함
- 소문자를 주로 사용
- 요청하는 자원에 대한 명사 형태로 작성
- 두 단어 이상 연결 될 경우 "-"를 사용한다.
- 의미있는 이름으로 일관성있게 작성해야 함.
API이란 ?
API : Interface란 두 개체 간의 정보를 공유하기 위한 방법으로, API는 프로그램 간 정보를 공유하기 위한 방법이다
- 함수나 메소드를 호출하는 형식의 API
- HTTP등의 기술로 네트워크를 통한 원격 자원을 호출하는 API 등 ..
(1) HTTP API : HTTP(s)를 활용해서 원격의 데이터를 공유하기 위한 API를 의미한다.
(2) REST API (Representational State Transfer)
웹 상에서 효율적으로 데이터를 공유하기 위한 아키텍처 스타일을 의미한다.
다양한 조건이 만족되어야 하며, 실무에서 모든 조건을 만족하게 구현하는 것은 어려움
실무에서는 HTTP API와 REST API를 혼용하는데 주로 "REST API"라는 명칭이 사용됨
@RestController Annotation은 REST API, HTTP API를 위한 클래스를 명시하는 것이다.
@RestController 내에 @RequestMapping이 붙은 개별 메소드들이 하나의 REST API, HTTP API
Spring의 RequestMapping 과 URI
- Spring Controller의 메소드들은 URI에 따라 호출이 결정된다.
- 기본 도메인에 이어지는 '/path'들에 의해 결정 됨.
- https://localhost:8080/user
- https://localhost:8080/post/1
- RequestMapping Annotatiion에 URI path 정보를 명시한다.
- @RequestMapping(value = "/user")
- → xxxxx/user 의 요청시 프레임워크에 의해 해당 메서드가 호출됨
- 특정 Controller 클래스 내부의 모든 메소드에 Path를 적용하는 것이 가능하다
- user/paid , user/enterprise , user/administrator
- user의 하향식 구조 지정된 Path 처리
[3] Request 파라미터
- Client가 Server에 요청(Request)를 할 때 추가적으로 전송하는 데이터
- Spring Framework는 Request 파라미터를 메소드의 파라미터에 저장함
- 2가지 유형의 Request 파라미터가 주로 사용됨
- Query String
- Path Parameter
- 크기가 큰 데이터를 보내기 위해서는 다른 방식이 필요함
- Request Body ..
[1] Query String ( key , value , & )
- URI와 파라미터의 영역을 구분하여 사용할 수 있다.
- URI에 이어지는 '?' 뒤에 Key1 = value1&key2=value2& ...형태로 작성
- KEY가 파라미터의 이름을 의미하고, Value는 파라미터의 값을 뜻함
- @RequestParam를 통해 Query를 통해 들어온 값을 처리한다.
(ex) RequestParam의 예시
→ https://www.google.com/search"?q=codepresso&sourceid=chrome&ie=UTF-8"
( Key 1 : q , Value : codepresso , Key 2 : sorceid , Value 2: chrome ... )
→ https://www.naver.com/search.naver"?where=nexearch&query=codepresso"
( Key 1 : where , Value : nexearch , Key 2 : query , Value = codepresso )
Query String의 Spring 활용
>> https??localhost:8080/psot?category=it&id=10
>> URI에서 들어온 인자를 통해서 id와 category가 변수안에 저장되어 출력하게 된다.
>> You Request it-10 post
Request 파라미터의 요소
- name : query String의 key, key와 변수명이 같을 경우 생략 가능
- required : 필수 여부
- defaultValue : 데이터가 없는 경우 기본 값
@RequestParam( name = "category",
required = false,
defaultValue = "it") String category)
[2] Path parameter ( name, required, defaultvalue )
- URI의 일부를 파라미터 값으로 사용 한다.
- domain/user/1
- domain/user/3/post/27
- @PathVariable
(ex)
→ https://brunch.co.kr/@thinkaboutlove/199
→ https://www.codepresso.kr/course/9
- @RequestMapping value URI에 {xxx}로 Path param임을 표시한다.
- 메소드 파라미터에 @PathVariable Annotation을 사용한다.
- 선택적 데이터의 경우에는 Path Param을 잘 사용하지 않음 ( 들어 올 수도/ 안들어 올 수도 )
- { } 를 통해서 Path parameter가 input 될 위치를 표현한다.
Path Parameter를 Spring에서 활용
>> https??localhost:8080/user/admin/id/100
>> You Request admin-100 post
일반적인 추천 사항
- 조직마다 표준이 존재하고, 표준에 따라 개발하는 것이 원칙
Path Param | -> 특정 자원을 요청 하는 경우는 path param을 주로 사용한다. -> 필수 데이터는 Path param을 주로 사용한다. |
Query String | -> 정렬이나 추가 필터링을 위한 데이터는 Query String을 사용한다. -> 선택적 데이터는 Query String을 주로 사용한다. |
- 서로 mix하여 사용하는 것도 가능하다
- https://codepresoo.kr/courses/Spring?order=latest
[3] Request Body
- 일반적으로 데이터를 저장 및 수정하는 경우 POST, PUT Method가 사용된다.
- GET, DELETE, Query String, Path Param이 주로 사용
- Request Body에 다양한 포맷의 데이터 전송이 가능하다.
- JSON 데이터 형식이 주로 사용된다.
- Clinet에서는 Json 데이터를 전송하고, Sping에서는 Json 데이터를 JAVA 객체 파라미터로 저장함.
[3] Response
Spring Controller와 Response 데이터
Response란
> Clinet가 Server에 특정 요청을 하면, Server는 요청에 대한 처리를 한 후 결과를 응답한다.
> 응답 형식은 단순 문자열, 이미지, 영상, HTML 페이지, JSON 등..
@Controller | HTML 파일과 같은 view를 응답함 |
@RestController | 메소드 반환 값 자체를 응답 ( 단순 문자열, JSON ) |
객체를 반환하면 반환하는 객체의 구조와 유사한 JSON 형태의 데이터가 응답 된다.
JSON - JavaScript Object Notation
데이터를 교환하는데 사용되고 XML보다 가볍고 읽기 편리함
- 웹 개발 시 가장 일반적으로 사용하는 응답 데이터 포맷
- 프론트엔드에서는 JSON 형식의 데이터를 응답 받아서 화면을 구성함
- 각 REST API 별로 어떤 JSON 데이터를 응답할 것 인지 사전에 정함
- 프론트-백엔드 사이 사전에 협의된 JSON 데이터에 맞춰 구현함
- Spring Boot에서는 객체를 반환하면 적절한 JSON 형식으로 변환하여 Client로 최종 응답함
JSON 기본 문법
- JSON 객체(Object)가 가장 기본 단위로 "Key":value의 데이터를 포함한다.
- JSON 객체의 시작과 끝은 중괄호 {} 를 사용한다
- Key는 큰따옴표""로 묶는다
- value에는 다양한 형태의 데이터 타입이 사용 가능하다
- 문자열, 숫자, Bool, Null, json 배열, json 객체
- 다수의 "Key":value는 쉼표(,)로 구분한다.
- Key-value 형식은 중첩되어서 사용하는 것이 가능하다.
- Json 배열은 순서가 있는 데이터의 나열로 대괄호 [] 로 표현한다.
- Json 배열 안에 다양한 자료형과 객체, 배열도 포함하는 것이 가능하다.
HTTP
- Hyper Text(웹 페이지)를 컴퓨터가 주고 받기 위하 규약
- 컴퓨터 간의 데이터를 주고 받기 위해서 국제 표준 단체의 명확학 약속이자 표준
- 모든 브라우저의 웹 서버는 HTTP 표준에 맞춰 개발되고 배포 통신된다.
HTTP 메소드
- HTTP 규약 중 하나로, 특정 자원에 대해 수행 하는 행동의 종류를 명시함
- HTTP Method를 사용하면 단일 URI로 다양한 행동을 정의하는 것이 가능
- 주로 사용되는 HTTP 메소드는 아래와 같고 DB의 기본 4동작과 유사함 (CRUD)
- GET - 자원 조회
- POST - 자원 생성
- PUT - 자원 수정
- DELETE - 자원 삭제
DB 동작 | 행동 | HTTP method |
C - Create | 데이터 저장 | POST |
R - Read | 데이터 조회 | GET |
U - Update | 데이터 수정 | PUT, PATCH |
D - Delete | 데이터 삭제 | DELETE |
- HTTP Method를 사용하면 단일 URI로 다양한 행동을 정의하는 REST API를 설계하는 것이 가능하다.
- HTTP Method는 규약이지 규칙이 아니다.
- 에러는 발생하지 않지만 Best Practice에 맞게 설계한 것은 아님
HTTP Method의 구현
- @RequestMapping의 요소로 Method를 명시할 수 있음
- default는 GET method
- 요청 된 HTTP Method에 따라 해당 Controller의 Java 메소드가 호출된다.
- 각 Java 메소드에서 HTTP 메소드에 해당하는 처리를 수행하도록 설계하는 것이 권장된다.
HTTP Method를 위해 간소화 된 Annotation도 존재한다.
@RequestMapping ( method = GET ) | @GetMapping |
@RequestMapping ( method = POST ) | @PostMapping |
@RequestMapping ( method = PUT ) | @PutMapping |
@RequestMapping ( method = DELETE ) | @DeleteMapping |
>> 즉 URI의 변화 없이 HTTP 메서드를 통해서 웹의 동작 방식을 변화할 수 있음 .
API 문서
- API는 정보를 주고 받기 위한 방법/약속이다.
- API를 사용하기 위해서 사용 방법을 알아야 한다.
- API 문서는 API를 사용하는 방법을 명세한 문서이다.
- 예) 무엇을 리턴하고, 파라미터는 무엇이고, 어떻게 동작하는 지 등 문서로 설명함.
REST API 문서화
- 프론트엔드에서 호출 하기 위한 REST API의 정보가 명세 된 문서
- 프론트엔드 개발자는 약속 된 REST API 문서에 의존하여 프론트엔드를 개발함
- 프론트엔드 등 Client를 호출하고 활용하는 데 어려움이 없도록 상세하게 작성 되어야 함
- 잘 작성된 REST API 문서가 잘 작성 될 수록 Communication 비용이 줄어 든다.
REST API 문서가 담고 있어야 하는 정보
- REST API 설명
- URI
- HTTP Method
- Request 파라미터 ( 필수 파라미터 and 선택 파라미터 )
- Response 데이터 ( 필수 응답 and 선택 응답 )
- 가능한 에러 코드 및 대응 방법
- 호출 예시 .. 등
- 코드프레소 Java 웹 개발 체험단 활동 중
- 코드프레소 웹개발 트랙의 "처음 시작하는 SQL 프로그래밍" 내용입니다.
- 코드프레소 URL: https://www.codepresso.kr/
'FrameWork & Runtime > Spring' 카테고리의 다른 글
Spring 서비스 계층 (0) | 2022.02.28 |
---|---|
<코드 프레소 웹 개발 트랙> Spring Boot 웹 개발 초급 [1] (0) | 2022.02.22 |
Spring Framework와 DI&IOC (1) | 2022.02.21 |
<코드 프레소 웹 개발 트랙> Spring Boot 웹 개발 입문 [2] (0) | 2022.02.07 |
<코드 프레소 웹 개발 트랙> Spring Boot 웹 개발 입문 [0] (0) | 2022.02.02 |