새소식

TIL

[TIL] 230513 <Spring> 학습 준비하기

  • -

 

 

*편의기능*

 

1. Auto Import

 

2. Editor Zoom : Mouse Wheel

 

 


빌드 자동화 시스템

- 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 등에 사용)

웹 서버의 기본 동작 원리

  1. 브라우저를 통해 HTTP Request로 웹사이트를 웹서버에 요청
  2. 웹서버는 요청을 승인하고 HTTP Response를 통해 웹사이트 데이터를 브라우저에 전송
  3. 마지막으로 브라우저는 서버에서 받아온 데이터를 이용해 웹사이트를 브라우저에 나타냄
    ㄴ 기본적으로 브라우저가 웹서버에 요청을 할때는 항상 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로 하여 자동으로 설정
    - 외부 라이브러리나 하위 프레임워크들의 의존성 관리가 매우 쉬워짐

기존에는 외부 라이브러리와 프레임워크를 사용하기 위해서 각각의 버전들의 호환성을 직접 확인해가면서 의존성들을 설정해야 했지만 SpringBoot에서는 spring-boot-starter-web 처럼 필요한 외부 라이브러리들과 프레임워크들을 의존성에 맞게 starter로 묶어서 제공해줌. 따라서 이전처럼 각각의 버전 호환성을 직접 확인할 필요가 없어짐.

        - 기본적으로 starter-web dependency를 설정하면 자동으로 내장형 Apache Tomcat을 제공해줌

 



Postman

API 개발을 빠르고 쉽게 구현할 수 있도록 도와주는 소프트웨어 플랫폼
ㄴ API에 맞춰서 HTTP 요청을 서버에 보내고 응답을 확인해봐야 우리가 만든 서버가 제대로 동작 하는지 확인가능한데,
     이 확인 작업을 간편하게 할 수 있도록 도와주는 플랫폼 중 하나임

 

 

▼ API 생성&테스트 예시

spring-prepare 프로젝트와 Postman을 사용하여 “Hello World”를 출력하는 API를 만들고 테스트

API 테이블

 

1. API 요청을 받아서 처리하기 위해 HelloController 생성 후 코드 작성

 

2. Postman을 사용하여 API를 테스트
(Workspaces - New - HTTP Request - GET 방식 선택, http://localhost:8080/api/hello URL 입력 - Send 클릭)

 

 


 

  • Method (호출/요청 방식)
    • GET : 어떤 리소스를 얻을 때 사용. 브라우저의 주소창에 URL을 입력하면 GET 메서드를 사용해서 서버에 요청을 보냄.
    • POST : 웹 서버에 데이터를 게시할 때 사용 (ex. 회원가입, 게시글 작성, 댓글 작성)
    • 가장 대표적인 요청 방식이 GETPOST
    • 그외 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

자바 프로그래밍 언어용 단위 테스트 프레임워크

build.gradle 파일을 열어보면 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

자바 프로젝트 진행에 거의 필수적으로 필요한 메서드/생성자 등을 자동 생성해줌으로써 코드를 절약할 수 있도록 도와주는 라이브러리

▶ 설치

1. 환경설정

  • Windows: Ctrl + Alt + S
  • macOS: command + ,


2. 검색창에 "Annotation Processors" 입력 후, 우측 "Enable ~" 체크하고 OK 클릭

 

3. Shift 두 번 누르고 plugins 입력 후 엔터 (플러그인 메뉴 찾아들어가는것)

4. Lombok을 검색했을 때 installed 상태라면 설치 완료

 

 

▶ 사용

  • @Getter, @Setter

클래스 위에 롬복 @Getter, @Setter를 추가한 후 컴파일된 코드를 확인해보면 직접 작성하지 않은 getUsername() , getContents() 등의 관련 메서드가 자동으로 추가되어있음

 

  • @AllArgsConstructor : 모든 필드를 파라미터로 가진 오버로딩된 생성자 만들어줌
  • @NoArgsConstructor : 기본 생성자 만들어줌


  • @RequiredArgsConstructor : final 제어자가 붙은 필드를 파라미터로 가진 오버로딩된 생성자를 만들어줌

 

 

application.properties

Spring과 관련된 설정을 할 때 사용되는 파일

- 자동으로 설정되고 있는 설정 값을 쉽게 수정 가능
- DB 연결 시 DB의 정보를 제공해야하는데 이 파일을 이용하여 쉽게 값을 전달 가능

  • Apache Tomcat을 사용하여 서버를 실행하면 기본 port 설정이 8080으로 되어있음
  • application.properties 파일에서 server.port=8081로 설정을 하면 서버의 port 번호를 ‘8080’에서 ‘8081’로 바꿔서 실행가능
Contents

포스팅 주소를 복사했습니다

이 글이 도움이 되었다면 공감 부탁드립니다.