Spring 입문주차- 1

이진일·2026년 4월 6일
post-thumbnail

내일배움캠프 단기 심화 7기 START!

오늘부터 내일배움캠프 단기 심화 7기 과정이 시작되었다.

"기록은 기억을 지배한다."

블로그를 개설한지는 오래되었지만 꾸준하게 작성하지 못했었다. 내일배움캠프에서 TIL을 주5일은 꾸준하게 작성하는 것을 첫번째 목표로 설정했다.


Gradle이란?

Gradle은 빌드 자동화 시스템이다.
Gradle을 사용하면 간편하게 Java 소스 코드를 실행 가능한 jar파일로 만들어준다.

build.gradle

build.gradleGradle 기반의 빌드 스크립트이다. 주로 groovy 언어로 작성하는데 이 스크립트를 작성하면 소스 코드를 빌드하고 라이브러리들의 의존성을 쉽게 관리할 수 있다.

build.gradle에서 dependencies부분에 외부 라이브러리들을 작성하면 GradleMaven Repository같은 외부 저장소에서 자동으로 다운로드한다.
또한 다른 라이브러리들과의 의존성을 자동으로 관리해주기 때문에 라이브러리들간의 충돌 걱정하지 않아도 되어서 편리하다.


API란?

API는 다른 소프트웨어 시스템과 통신하기 위해 따라야하는 규칙을 정의한다. 쉽게 말하면 서로 다른 소프트웨어 시스템들이 통신하기 위해 정하는 약속이다.

RESTful API

Representational State Transfer(REST)는 API 작동 방식에 대한 조건을 부과하는 소프트웨어 아키텍처이다.
REST 아키텍처 스타일을 따르는 API를 REST API라고 한다. 그리고 REST 아키텍처를 구현하는 웹 서비스를 RESTful 웹 서비스라고 한다.


Web Server 와 WAS

웹 서버는 정적인 컨텐츠를 클라이언트에게 전달해주거나 정적인 요청이 들어오면 WAS에 전달하는 역할을 수행한다.(ex. Apache, Nginx)

WAS는 웹 서버의 기능을 대부분 처리할 수 있고 로그인, 회원가입을 처리하거나 게시물을 조회하는 등의 다양한 로직들을 수행하는 프로그램을 동작시킬 수 있다.(ex. Tomcat, JBoss)

Apache Tomcat

Apache Tomcat은 Apache와 Tomcat이 합쳐진 형태로 정적인 데이터 처리와 동적인 데이터 처리를 효율적으로 해준다.


Spring과 Spring Boot

Spring 프레임워크는 AOP, Ioc, DI등과 같은 핵심 기능들을 가지고 있어서 오랫동안 사랑받고 있다. 하지만 너무나도 많은 xml 설정들이 필요하여 사용하기에 불편하다.

그래서 이런 불편한 점들을 개선하기 위해 Spring Boot가 등장했다.
Spring Boot는 Java의 애노테이션을 사용하여 아주 간편하게 설정할 수 있다.

기존에 외부 라이브러리를 사용하기 위해서는 직접 버전과 호환성을 맞춰주어야 했지만 Spring Boot에서는 spring-boot-starter-web처럼 필요한 외부 라이브러리들을 제공해주어 간편하게 사용할 수 있다.

마지막으로 Spring Boot는 Apache Tomcat을 내장하고 있어서 쉽게 서버를 실행할 수 있다는 장점이 있다.


HTTP란?

전 세계적으로 가장 널리 쓰이는 통신 규약이다.

HTTP에서는 Request와 Response라는 개념이 존재한다.

  • 브라우저가 서버에게 원하는 데이터를 요구(Request)한다.
  • 서버는 브라우저가 원하는 데이터가 있는지 확인하여 그에 맞는 응답(Response)해준다.
  • 브라우저는 서버에게 받은 데이터를 기반으로 브라우저에 그려주는것이다.

Method(호출/요청 방식)

Method는 종류가 다양하게 여러가지가 있지만 몇가지만 소개해보자면 아래와 같다.

  • GET : 주로 리소스를 조회할 때 사용한다. 브라우저에서 주소창에 URL을 입력하면 GET메서드를 사용해서 서버에 요청을 보낸다.
  • POST : 주로 새로운 리소스를 생성할 때 사용한다.
  • PUT : 리소스를 완전히 대체할 때 사용한다.
  • PATCH : 리소스를 부분 변경할 때 사용한다.
  • DELETE : 리소스를 삭제할 때 사용한다.

Header(추가 데이터, 메타 데이터)

  • 브라우저가 어떤 페이지를 원하는지
  • 요청 받은 페이지를 찾았는지
  • 요청 받은 데이터를 성공적으로 찾았는지
  • 어떤 형식으로 데이터를 보낼 지

등등 다양한 의사 표현을 위한 데이터를 모두 Header에 넣고 주고 받는다.

Payload(데이터, 실제 데이터)

  • 서버가 응답을 보낼 때에는 항상 Payload를 보낼 수 있다.
  • 클라이언트가 요청할 때는 GET메서드를 제외하곤 모두 Payload를 보낼 수 있다.

테스트 코드

어떠한 서비스를 개발했다면 정상적으로 동작하는지 버그는 없는지 테스트해야 한다. 블랙박스 테스팅으로 사용자의 입장에서 동작을 검사할 수도 있지만 서비스 규모가 커질수록 블랙바스 테스트로 모든 기능을 테스트하기에는 어려움이 많다.

그래서 테스트 코드를 작성하는 것이 좋다.

Spring에서는 테스트 코드 작성을 잘 할 수 있는 환경을 제공해준다.
JUnit이라는 자바 프로그래밍 언어 용 단위 테스트 프레임워크를 사용할 수 있다.

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);
    }

    @Test
    @DisplayName("나누기 테스트")
    void test2() {
        Calculator calculator = new Calculator();
        Double result = calculator.operate(8, "/", 2);
        System.out.println("result = " + result);

        Assertions.assertEquals(4, result);
    }
}

JUnit은 별도 테스트 실행 환경을 가지고 있기 때문에 따로 main()메서드를 실행하거나 서버를 실행하지 않아도 각각의 메서드 혹은 기능별 테스트를 실행할 수 있다.

🚨테스트코드 실습 중 문제발생

테스트 코드 실습하며 테스트 코드를 실행하는데 Gradle 빌드 중 테스트 단계에서 오류가 발생했다.

로그를 확인해보니 java.lang.ClassNotFoundException: com.example.springprepare.calculator.CalculatorTest 이 에러 메시지가 있었다. Gradle이 테스트를 실행하려고 하는데 실행해야 할 CalculatorTest 클래스 파일을 찾지 못해서 발생하는 문제였다.

IntelliJ가 테스트를 실행할 때 Gradle을 거치지 않고 IntelliJ 자체 엔진을 사용하도록 설정을 변경했다. "Build and run using" 과 "Run tests using" 항목을 모두 IntelliJ IDEA로 변경 후 적용했다.

Gradle 캐시나 IntelliJ와 싱크가 맞지 않아 오류가 발생했던것으로 보인다.


끝!

0개의 댓글