[TIL] 230513 <Spring> 학습 준비하기
- -
[프로젝트 생성과 Git 연동]
*편의기능*
1. Auto Import
2. Editor Zoom : Mouse Wheel
[Gradle]
빌드 자동화 시스템
- Build : 소스 코드를 실행 가능한 결과물로 만드는 과정
- Gradle을 사용하여 간편하게 Java 소스 코드를 실행 가능한 jar 파일로 만들 수 있음
build.gradle
Gradle 기반의 빌드 스크립트
- 소스 코드를 빌드하고 라이브러리들의 의존성 쉽게 관리 가능
- groovy 또는 kotlin 언어로 작성 가능
- 필요한 외부 라이브러리들을 dependencies 부분에 작성 시 Gradle이 해당 라이브러리들을 Maven Repository와 같은 외부 저장소에서 자동으로 다운로드해옴 (https://mvnrepository.com/)
→ External Libraries에서 Gradle이 다운로드해온 라이브러리들 확인 가능 - 다른 라이브러리들과의 의존성으로 자동으로 관리해주어 라이브러리들 간의 충돌 걱정 필요 없음
- SpringBoot의 버전 변경 가능
[서버]
네트워크
여러 대의 컴퓨터 또는 장비가 서로 연결되어서 정보를 주고 받을 수 있게 도와주는 기술
- 컴퓨터, 라우터, 스위치, 허브 등의 장비들이 각각의 역할 수행하여 정보 주고받음
- 서로 정보를 주고 받기 위해 IP 주소, 서브넷 마스크, 게이트웨이 등의 정보를 설정하고 네트워크 프로토콜 이용하여 통신
Client 와 Server
클라이언트는 브라우저를 이용하여 서버에 정보를 요청하고 응답을 받음 (IP 주소 사용)
웹 서버
인터넷을 통해 HTTP를 이용하여 웹 상의 클라이언트의 요청을 응답해주는 통신을 하는 일종의 컴퓨터 (ex.이메일,SNS 등에 사용)
- 브라우저를 통해 HTTP Request로 웹사이트를 웹서버에 요청
- 웹서버는 요청을 승인하고 HTTP Response를 통해 웹사이트 데이터를 브라우저에 전송
- 마지막으로 브라우저는 서버에서 받아온 데이터를 이용해 웹사이트를 브라우저에 나타냄
ㄴ 기본적으로 브라우저가 웹서버에 요청을 할때는 항상 GET method로 요청
API (application programming interface)
다른 소프트웨어 시스템과 통신하기 위해 따라야 하는 규칙
ㄴ 서로 다른 어플리케이션이 약속한 방식의 API 요청을 수행하면 정해진 결과물을 반환
RESTful API
- REST (Representational State Transfer) : API 작동 방식에 대한 조건을 부과하는 소프트웨어 아키텍처
- 처음에 인터넷과 같은 복잡한 네트워크에서 통신을 관리하기 위한 지침으로 만들어졌음
- REST 아키텍처 스타일을 따르는 API → REST API
- REST 아키텍처를 구현하는 웹 서비스 → RESTful 웹 서비스
- 서버의 api가 적절하게 http를 준수하며 잘 설계되어있으면 RESTful하게 설계되어 있는 것임
ㄴ API의 리소스 식별자를 중복 없이 고유하게 잘 만들고, 해당 API에 적절하게 HTTP 메서드 사용 시
Apache Tomcat
Web Server 와 Web Application Server(WAS)
- Web Server : 브라우저에서 URL을 입력하여 어떠한 페이지를 요청했을 때 HTTP의 요청을 받아들여 HTML 문서와 같은 정적인 콘텐츠를 사용자에게 전달해주는 역할 (종류: Apache, Nginx)
- 정적인 콘텐츠 즉, 이미 완성이 되어있는 HTML과 같은 문서를 브라우저로 전달
- 브라우저로부터 ‘로그인하여 MyPage를 요청’과 같은 동적인 요청이 들어왔을 때 웹 서버 자체적으로 처리하기 어렵기 때문에 해당 요청을 WAS에 전달
- WAS (종류: Tomcat, JBoss)
- 웹 서버와 똑같이 HTTP 기반으로 동작
- 웹 서버에서 할 수 있는 기능 대부분을 WAS에서도 처리 가능
- WAS를 사용 시 로그인,회원가입을 처리하거나 게시물을 조회하거나 정렬하는 등의 다양한 로직들을 수행하는 프로그램을 동작시킬 수 있음
Apache Tomcat
- Tomcat : 동적인 처리를 할 수 있는 웹 서버를 만들기 위한 웹 컨테이너
- Apache Tomcat : Apache와 Tomcat이 합쳐진 형태로, 정적인 데이터 처리와 동적인 데이터 처리를 효율적으로 가능
SpringBoot 와 Spring
- Spring 프레임워크
- 2004년에 1.0이 등장한 이후 20년가까이 계속해서 업그레이드, 현재는 Spring 6.0이 등장한 아주 오래되고 강력한 프레임워크
- AOP, IoC/DI 등과 같은 아주 강력한 핵심 기능들 보유
- 하지만 이러한 핵심 기능들을 사용하기 위해서는 너무나도 많은 xml 설정들이 필요 → 2014년 SpringBoot가 등장
- SpringBoot
- 기존의 xml 설정 대신 Java의 애너테이션 기반의 설정을 적극적으로 사용하여, 무겁고 작성하기 힘들던 xml 대신에 애너테이션을 사용하여 아주 간편하게 설정
- 기본적으로 개발에 필요한 설정 정보들을 일반적으로 많이 사용하는 설정 값을 default로 하여 자동으로 설정
- 외부 라이브러리나 하위 프레임워크들의 의존성 관리가 매우 쉬워짐
- 기본적으로 starter-web dependency를 설정하면 자동으로 내장형 Apache Tomcat을 제공해줌
Postman
API 개발을 빠르고 쉽게 구현할 수 있도록 도와주는 소프트웨어 플랫폼
ㄴ API에 맞춰서 HTTP 요청을 서버에 보내고 응답을 확인해봐야 우리가 만든 서버가 제대로 동작 하는지 확인가능한데,
이 확인 작업을 간편하게 할 수 있도록 도와주는 플랫폼 중 하나임
▼ API 생성&테스트 예시
spring-prepare 프로젝트와 Postman을 사용하여 “Hello World”를 출력하는 API를 만들고 테스트
1. API 요청을 받아서 처리하기 위해 HelloController 생성 후 코드 작성
2. Postman을 사용하여 API를 테스트
(Workspaces - New - HTTP Request - GET 방식 선택, http://localhost:8080/api/hello URL 입력 - Send 클릭)
[HTTP]
- Method (호출/요청 방식)
- GET : 어떤 리소스를 얻을 때 사용. 브라우저의 주소창에 URL을 입력하면 GET 메서드를 사용해서 서버에 요청을 보냄.
- POST : 웹 서버에 데이터를 게시할 때 사용 (ex. 회원가입, 게시글 작성, 댓글 작성)
- 가장 대표적인 요청 방식이 GET 과 POST
- 그외 DELETE 등의 여러 요청 방식이 존재
- Header (추가 데이터. 메타 데이터)
- 브라우저가 어떤 페이지를 원하는지
- 요청 받은 페이지를 찾았는지
- 요청 받은 데이터를 성공적으로 찾았는지
- 어떤 형식으로 데이터를 보낼지
- 이 외에도 아주 다양한 의사 표현을 위한 데이터를 모두 Header 필드에 넣고 주고 받음
위에서 설명 된 메서드도 헤더에 포함되어 서버로 보내짐
GET naver.com HTTP/1.1
** Headers 탭 살펴보기 **
▶ General (브라우저에서 서버로 보낸 Request 데이터)
< HTTP 상태 코드(Status Code) >
브라우저와 서버간의 요청, 응답 과정에서 발생할 수 있는 상황들을 표현가능
- HTTP 상태 코드는 3자리 숫자로 이루어져 있음
ㄴ 첫 번째 자리 숫자 : 상태 코드의 분류를 나타내는 용도
ㄴ 나머지 두 자리 : 세부적인 정보
◆ 1xx (Informational)
- 1xx 상태 코드는 요청이 수신 되었으며 처리가 계속되고 있음
- 주로 웹 브라우저와 같은 클라이언트가 서버와의 연결 상태를 확인하기 위해 사용
◆ 2xx (Successful)
- 2xx 상태 코드는 클라이언트의 요청이 성공적으로 처리 되었음
- 가장 많이 사용되는 상태 코드는 200
(요청이 성공적으로 처리 되었으며 클라이언트가 요청한 데이터가 서버에서 제공됨을 의미)
◆ 3xx (Redirection)
- 3xx 상태 코드는 클라이언트가 추가적인 조치를 취해야 함
- 주로 페이지 이동, 리다이렉션 등에 사용됨
◆ 4xx (Client Error)
- 4xx 상태 코드는 클라이언트에 오류가 있음
- 주로 클라이언트의 잘못된 요청, 인증 오류 등에 사용됨
- 가장 많이 사용되는 상태 코드는 404
(클라이언트가 요청한 페이지나 리소스를 서버에서 찾을 수 없음을 의미)
◆ 5xx (Server Error)
- 5xx 상태 코드는 서버에 오류가 발생했음
- 주로 서버의 오류, 서버 과부하 등에 사용됨
- 가장 많이 사용되는 상태 코드는 500
(서버 내부 오류가 발생함을 의미)
▶ Request Headers (브라우저에서 서버로 보낸 Request 데이터)
▶ Response Headers (서버가 웹 페이지 데이터와 함께 보낸 추가 데이터)
- Payload (데이터. 실제 데이터)
- 서버가 응답을 보낼 때에는 항상 Payload를 보낼 수 있음
- 클라이언트(브라우저)가 요청을 할 때에도 Payload를 보낼 수 있음.
- "GET method를 제외하곤 모두 Payload를 보낼 수 있다" 는게 HTTP에서의 약속임
- HTTP의 Payload를 통해 아래와 같은 데이터들을 요청하고 응답 받을 수 있음
// HTML
<!DOCTYPE html>
<html>
<head><title>By @ResponseBody</title></head>
<body>Hello, Spring 정적 웹 페이지!!</body>
</html>
// JSON
{
"name":"Robbie",
"age": 20
}
[테스트 코드]
버그
소프트웨어가 예상하지 못한 결과를 내는 것
ㄴ '소스 코드'나 '설계과정에서의 오류' 때문에 발생
테스트
개발 코드 배포 전, 버그를 (최대한 많이) 찾아내는 법!
- 블랙박스 테스팅 : 소프트웨어 내부 구조나 동작원리를 모르는 상태에서, 즉 웹 서비스의 사용자 입장에서 동작을 검사하는 방법
> 장점 : 누구나 테스트가 가능 (개발자부터 디자이너, 베타 테스터 혹은 사장님까지!)
> 단점 :
- 기능이 증가될 수록 테스트의 범위가 증가하여 시간이 갈수록 테스트하는 사람이 계속 늘어나야함
- 테스트 하는 사람에 따라 테스트 퀄러티가 다를 수 있습니다. → QA 직군이 있는 이유
- 개발자 테스트
> 장점 :
- 빠르고 정확한 테스트가 가능 (예상 동작 VS 실제 동작)
- 테스트 자동화가 가능 (배포 절차 시 테스트 코드가 수행되어 동작 검증)
- 리팩토링이나 기능 추가를 할 때 더욱 편리
> 단점 :
- 개발 시간이 오래 걸림
- 테스트 코드를 유지보수하는 비용
Spring에서는 '테스트 코드' 작성을 잘 할 수 있는 환경을 제공
▼ ▼ ▼
JUnit
자바 프로그래밍 언어용 단위 테스트 프레임워크
▼ 테스트 파일 생성 예시
Calculator.java 코드 작성 후 그에 대한 테스트 파일 생성 (그 후 테스트 코드 작성)
package com.sparta.springprepare.calculator;
public class Calculator {
public Double operate(double num1, String op, double num2) {
switch (op) {
case "*":
return num1 * num2;
case "/":
if (num2 != 0) {
return num1 / num2;
} else {
return null;
}
case "+":
return num1 + num2;
case "-":
return num1 - num2;
default:
throw new IllegalArgumentException("잘못된 연산자입니다.");
}
}
}
1. "Calculator.java" 파일 내에서 마우스 오른쪽 버튼 클릭 > "Generate..." 클릭
2. "Test..." 클릭
- 단축키 사용
- Windows : Ctrl + shift + t
- Mac : ⌘ + shift + t
3. 기본세팅 그대로 OK 눌러서 생성
4. 자동으로 경로를 맞춰서 'CalculatorTest'파일 생성된 것 확인 가능!
▼ 테스트 코드 작성 예시
CalculatorTest
package com.sparta.springprepare.calculator;
import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.DisplayName;
import org.junit.jupiter.api.Test;
class CalculatorTest {
@Test
@DisplayName("더하기 테스트")
void test1() {
Calculator calculator = new Calculator();
Double result = calculator.operate(8, "+", 2);
System.out.println("result = " + result);
Assertions.assertEquals(10, result); //예상결과인 10가 실제값이 아닐 경우 오류
}
@Test
@DisplayName("나누기 테스트")
void test2() {
Calculator calculator = new Calculator();
Double result = calculator.operate(8, "/", 2);
System.out.println("result = " + result);
Assertions.assertEquals(4, result); //예상결과인 4가 실제값이 아닐 경우 오류
}
}
JUnit은 테스트 실행 환경을 가지고 있기 때문에 따로 main() 메서드를 실행하거나 서버를 실행시키지 않아도 이렇게 각각의 메서드 혹은 기능별로 테스트 코드를 작성하여 실행 가능
[Lombok과 application.properties]
Lombok
자바 프로젝트 진행에 거의 필수적으로 필요한 메서드/생성자 등을 자동 생성해줌으로써 코드를 절약할 수 있도록 도와주는 라이브러리
▶ 설치
1. 환경설정
- Windows: Ctrl + Alt + S
- macOS: command + ,
2. 검색창에 "Annotation Processors" 입력 후, 우측 "Enable ~" 체크하고 OK 클릭
3. Shift 두 번 누르고 plugins 입력 후 엔터 (플러그인 메뉴 찾아들어가는것)
4. Lombok을 검색했을 때 installed 상태라면 설치 완료
▶ 사용
- @Getter, @Setter
- @AllArgsConstructor : 모든 필드를 파라미터로 가진 오버로딩된 생성자 만들어줌
- @NoArgsConstructor : 기본 생성자 만들어줌
- @RequiredArgsConstructor : final 제어자가 붙은 필드를 파라미터로 가진 오버로딩된 생성자를 만들어줌
application.properties
Spring과 관련된 설정을 할 때 사용되는 파일
- 자동으로 설정되고 있는 설정 값을 쉽게 수정 가능
- DB 연결 시 DB의 정보를 제공해야하는데 이 파일을 이용하여 쉽게 값을 전달 가능
- Apache Tomcat을 사용하여 서버를 실행하면 기본 port 설정이 8080으로 되어있음
- application.properties 파일에서 server.port=8081로 설정을 하면 서버의 port 번호를 ‘8080’에서 ‘8081’로 바꿔서 실행가능
'TIL' 카테고리의 다른 글
[TIL] 230516 <Spring> 메모장, Database와 SQL (0) | 2024.05.16 |
---|---|
[TIL] 230514 <Spring> Spring MVC (0) | 2024.05.14 |
[TIL] 240510 불변 객체(Immutable Object) (0) | 2024.05.10 |
[TIL] 240509 <트러블 슈팅> ConcurrentModificationException (2) | 2024.05.09 |
[TIL] 230508 <SQL> 없는 값 제외, 다른 값으로 대체, 범위지정, Pivot table, Window함수(Rank,Sum), 날짜포맷 (0) | 2024.05.08 |
소중한 공감 감사합니다