스터디 1주차 내용 정리 (01장-03장)

박서영·2026년 2월 14일

00장. 개발환경 구축하기

✅ 빌드 시스템: Gradle과 Maven의 차이점?

그레이들과 메이븐은 둘 다 자바에서 널리 사용하는 빌드 관리 도구. 작성한 소스코드를 사용자가 사용할 수 있는 형태로 바꿔주는 ‘빌드’라는 과정을 관리 및 자동화하는 도구를 ‘빌드 관리 도구’라함.

의존성 내려받기, 코드 패키징, 컴파일, 테스트 실행 등이 해당 과정에 포함되어 있음. 최근에는 그레이들을 메이븐보다 많이 사용하는 추세.

그레이들의 특징

  • 메이븐에 비해 가독성이 좋고 설정이 간단
  • 자바, 코틀린, 그루비 등 다양한 언어를 지원하며 원하는대로 빌드 스크립트를 작성할 수 있음
  • 빌드와 테스트 속도가 메이븐에 비해 빠름

스프링부트3 프로젝트 만들기

build.gradle 파일을 수정하여 만들 수 있음

//build.gradle 파일
plugins {
    id 'java'
    id 'org.springframework.boot' version '3.2.0'
    id 'io.spring.dependency-management' version '1.1.0'
}

group = 'org.example'
version = '1.0'
sourceCompatibility = '17'

repositories {
    mavenCentral()
}

dependencies {
    implementation 'org.springframework.boot:spring-boot-starter-web'
    testImplementation 'org.springframework.boot:spring-boot-starter-test'
}

test {
    useJUnitPlatform()
}
  • plugins : 프로젝트에 사용할 플러그인인 스프링부트 플러그인
    • org.springframework.boot: 프로젝트에 사용할 스프링부트 플러그인
    • spring.dependency-management: 스프링의 의존성을 자동으로 관리
  • group : 프로젝트 설정할 때 기본값인 그룹이름과 버전이 입력됨. 추가로 자바 소스 컴파일 시 사용할 자바 버전을 입력
  • repositories: 의존성을 받을 저장소 지정.
  • dependencies: 프로젝트를 개발하며 필요한 기능의 의존성을 입력
    • spring-boot-starter-web: 웹 관련 기능을 제공
    • spring-boot-starter-test: 테스트 기능 제공

초기설정

포스트맨 설치하기

  • 포스트맨: HTTP 요청을 보낼 수 있는 클라이언트 프로그램.
  • API: 사용자가 서버와 통신하기 위한 인터페이스

⇒ 포스트맨을 활용하여 API 개발을 만들고, 웹 브라우저에서 테스트하기 위한 작업을 간소화할 수 있음.

  • API 호출을 위해 매번 웹 브라우저를 키고 URL을 요청하는 작업을 생략하고 포스트맨을 통한 클릭으로 해당 작업을 수행할 수 있음.


01장. 자바 백엔드 개발자가 알아두면 좋은 지식

1.1 서버와 클라이언트

클라이언트

  • 정의: 서버로 요청하는 프로그램을 모두 일컬어 말함. 예) 웹 브라우저
  • 웹 브라우저에 주소를 입력하여 정보를 요청하는 것 = 서버에 요청하는 것

서버

  • 정의: 클라이언트의 요청을 받아 처리하는 주체.
  • 클라이언트의 요청에 따라 데이터를 넘겨주거나, 서버 내에서 요청을 처리함.

1.2 데이터베이스

데이터베이스

정의: 여러 사람의 데이터를 한 군데에 모아놓고 여러 사람이 사용할 목적으로 관리하는 데이터 저장소.

MySQL, 오라클, 포스트그레SQL: 데이터베이스X, 데이터베이스를 관리하기 위한 시스템의 이름

  • 데이터베이스의 동작 원리

    클라이언트(웹 브라우저) ↔ DBMS ↔ 데이터베이스

    클라이언트에서 DB를 조작하기 위한 언어로 DB 관리 시스템에 데이터 요청 → DB 관리 시스템은 DB에서 데이터를 꺼내 응답.

RDB

  • 데이터베이스는 RDB, NoSQL, NewSQL 등 다양한 종류가 존재
  • 가장 많이 사용하는 데이터베이스는 “RDB(Relational Database)”로 관계형 데이터베이스라는 뜻
  • 관계형 데이터베이스의 특징
    • 데이터를 행과 열로 이루어진 테이블로 관리.
    • 기본키(primary key)를 사용해 각 행을 식별.
    • 각 테이블 간에 관계를 지을 수 있음.
    • RDB의 예: 오라클, MySQL, SQL 서버, 포스트그레SQL

SQL

  • SQL: Structured Query Language로 쿼리, 즉 데이터 검색을 하는 언어.
  • 하나만 존재하지 않고, ANSI 표준과 RDB별로 차이 존재.

NoSQL

  • SQL의 문제점:

    • 데이터베이스의 성능을 높이기 위해서는 머신의 성능을 좋게하는 스케일 업/ 머신을 여러 대로 분리하는 스케일 아웃이 필요.
    • 스케일 업 ⇒ 장비를 업그레이드하여 수행 가능.
    • 스케일 아웃 ⇒ 데이터베이스의 분산 필요. + 이때 트랜잭션을 사용하면 성능이 떨어짐
  • 위의 SQL의 문제점 해결을 위해 NoSQL 등장.

1.3 아이피와 포트

아이피(IP)

  • 정의: 인터넷에서 컴퓨터/기기들이 서로 식별하고 통신하기 위한 주소. 아이피를 통해 주소를 찾을 수 있음.
  • 서버를 이용하기 위해서는 아이피뿐 아니라 포트까지 알아야함.
  • 아이피 = 서버를 찾기 위한 번호, 포트=서버에서 운용되고 있는 서비스를 구분하기 위한 번호.
  • 웹 브라우저의 주소에는 아이피와 포트가 들어있음.
    • https://: 서버의 443번 포트를 사용하기 위한 입력
    • 스프링부트 서버의 포트: 8080포트

1.4 라이브러리와 프레임워크

백엔드 개발에 필요한 모든 코드를 직접 작성하면 오랜 시간이 걸리기 때문에, 현업에서는 다른 사람(단체)가 만든 라이브러리와 프레임워크를 가져와 사용하게됨.

라이브러리

  • 정의: 애플리케이션 개발에 필요한 기능인 클래스, 함수 등을 모아놓은 코드의 모음.
  • 예) 로그 생성 기능, 로그 포매팅 지원 기능 등이 구현되어 있는 로그 라이브러리가 있으면, 개발자가는 단지 이런 기능이 묶여 있는 로그 라이브러리를 의존성에 추가하여 사용할 수 있음
  • 라이브러리는 서로 독립적이므로 라이브러리끼리는 영향을 주고받지 않음.

프레임워크

  • 정의: 소프트웨어 개발을 수월하게 하기 위한 소프트웨어 개발 환경.
  • 개발자는 프레임워크라는 틀에서 일해야함. 틀 안에서 개발해야한다는 단점이 있지만, 개발 효율이 높음

💡 요약

  • 프레임워크: 애플리케이션을 개발할 때 전체적인 구조를 잡기 위해 사용하는 것
  • 라이브러리: 개발을 하는 과정에서 필요한 기능을 구현하기 위해 사용

1.5 백엔드 개발자의 업무

  • 백엔드 개발자의 업무
    • 서버 측 애플리케이션을 개발
    • 서버에 대한 지식, 프로그래밍 지식, 프로그램 배포 및 안전하게 서비스할 수 있는 지식 활용
    • 과제 할당 → 과제 분석 → 개발 → 테스트(리뷰) → QA 및 버그 수정 → 배포 → 유지보수 순으로 업무 진행.

배포와 유지보수

  • 배포 방법

    • 롤링배포: 특정 개수의 서버들을 돌아가며 배포
    • 블루 그린 배포: 똑같은 서버 인스턴스를 띄우고 로드밸런서 설정을 바꾸는 방법
    • 카나리 배포: 전체 서버의 특정 비율만큼 배포해보고 문제없는 경우 점점 배포를 늘려가는 방법
  • CI/CD: 빌드부터 배포의 방법을 자동화하는 것을 말함.

    • CI: 지속적인 통합이라는 의미. 새로운 코드 변경사항이 정기적으로 빌드 및 테스트되어 저장소에 통합되는 것을 의미. 저장소에 통합되는 것을 의미.
    • CD: 지속적인 배포를 의미. 실제 프로덕션 환경까지 변경된 코드가 반영되는 것을 의미.

1.6 백엔드 프로그래밍 언어

파이썬

  • 데이터 분야와 더불어 서버 개발에도 많이 사용.
  • 대표적인 프레임워크: FastAPI, 플라스크, 장고

자바

  • 프레임워크: 스프링, 스프링부트

1.7 자바 애너테이션

자바 애너테이션

  • 정의: 자바로 작성하는 코드에 추가하는 표식.
  • 보통 @ 기호를 사용하면 JDK 1.5버전부터 사용 가능.
  • 애너테이션의 목적은 주로 ‘메타 데이터’로 사용하려는 경우임
애너테이션 이름설명
@Override선언된 메소드가 오버라이드됨
@Deprecated더 이상 사용되지 않음
@SuppressWarnings컴파일 경고를 무시함

02장. 스프링부트3 시작하기

2.1 스프링과 스프링부트

스프링

  • 엔터프라이즈 애플리케이션: 대규모의 복잡한 데이터를 관리하는 애플리케이션.
    • 많은 사용자의 요청을 동시에 처리해야하므로 서버 성능과 안정성, 보안이 매우 중요
  • 스프링 프레임워크는 서버 성능, 안정성, 보안을 매우 높은 수준으로 제공하는 도구.

스프링부트

  • 스프링의 단점: 설정이 매우 복잡함 ⇒ 이런 부분을 보완하기 위해서 스프링부트를 출시함.
  • 스프링부트: 스프링 프레임워크를 더 쉽고 빠르게 이용할 수 있또록 만들어주는 도구.
    • 빠르게 스프링 프로젝트를 설정할 수 있으며, 의존성 세트로 불리는 스타터를 사용해 간편하게 의존성을 사용 및 관리할 수 있음.

✅ 스프링부트의 주요 특징

  • 웹 애플리케이션 서버(WAS)가 내장되어 있어 따로 설치하지 않아도 독립적으로 실행 가능
  • 빌드 구성을 단순화하는 스프링부트 스타터를 제공
  • XML 설정을 하지 않고 자바 코드로 모두 작성 가능
  • JAR을 이용해 자바 옵션만으로도 배포 가능
  • 애플리케이션의 모니터링 및 관리 도구인 스프링 액츄에이터(spring actuator)를 제공

스프링부트와 스프링의 차이점

  1. 구성의 차이
    • 스프링: 애플리케이션 개발에 필요한 환경을 수동으로 구성하고 정의해야함
    • 스프링부트: 스프링 코어와 스프링 MVC의 모든 기능을 자동으로 로드하므로 수동으로 개발 환경을 구성할 필요가 없음.
  2. 내장 WAS의 유무
    • 스프링 애플리케이션은 일반적으로 톰캣과 같은 WAS에서 배포됨
    • WAS: 웹 애플리케이션 서버의 약자.
    • 스프링부트: WAS를 자체적으로 가지고 있음. → jar 파일만 만들면 별도로 WAS를 설정하지 않아도 애플리케이션을 실행할 수 있음.
    • 스프링부트의 내장 WAS: 톰캣, 제티, 언더토우가 있어서 상황에 필요한 WAS를 선택할 수 있음.

2.2 스프링 콘셉트 공부하기

제어의 역전과 의존성 주입

스프링은 모든 기능의 기반을 ‘제어의 역전(IoC)’과 ‘의존성 주입(DI)’에 두고 있음.

  1. IoC란?

    Inversion of Control의 줄인 표현. 제어의 역전은 다른 객체를 직접 생성하거나 제어하는 것이 아니라 외부에서 관리하는 객체를 가져와 사용하는 것을 말함.

    public class A{
    	b = new B();
    }
    
    //스프링 컨테이너가 객체를 관리하는 방식
    public class A{
    	private B b; 
    	//이렇게 코드에서 객체를 생성하지 않고, 어딘가에서 받아온 객체를 b에 할당
    }
  1. DI란?

    Dependency Injection의 줄인 표현으로 의존성 주입을 의미. 즉, 어떤 클래스가 다른 클래스에 의존한다는 의미. @Autowired 라는 애너테이션은 스프링 컨테이너에 있는 빈이라는 것을 주입하는 역할.

    • 빈이란? 스프링 컨테이너에서 관리하는 객체
    public class A{
    	//A에서 B를 주입받음
    	@Autowired
    	B b;
    }

    즉, 스프링은 클래스 A에서 B 객체를 쓰고 싶은 경우 객체를 직접 생성하는 것이 아니라 스프링 컨테이너에서 객체를 주입받아 사용함.

빈과 스프링 컨테이너

  • 스프링 컨테이너란?

    • 스프링 컨테이너는 빈을 생성하고 관리함. 빈이 생성되고 소멸되기까지의 생명주기를 관리.
    • 개발자가 @Autowired 같은 애너테이션을 사용해 빈을 주입받을 수 있게 DI를 지원하기도 함.
  • 이란?

    • 스프링 컨테이너가 생성하고 관리하는 객체. 앞의 코드의 B가 빈.

    • 스프링은 빈을 스프링 컨테이너에 등록하기 위해 XML 파일 설정, 애너테이션 추가 등의 방법을 제공함. ⇒ 빈을 등록하는 여러 가지 방법이 존재함.

    • 예) MyBean이라는 클래스에 @Component 애너테이션을 붙이면 MyBean 클래스가 빈으로 등록됨. 이후 스프링 컨테이너에서 이 클래스를 관리함. 이때 빈의 이름은 클래스 이름의 첫 글자를 소문자로 바꾸어 관리함.

      ```java
      @Component
      public class MyBean {
      }
      ```

      ⇒ 쉽게 스프링에서 제공해주는 객체라고 생각하기!

관점 지향 프로그래밍

AOP(Aspect Oriented Programming): 관점 지향 프로그래밍으로, 프로그래밍에 대한 관심을 핵심 관점, 부가 관점으로 나누어서 관심 기준으로 모듈화하는 것을 의미함.

예) 계좌이체, 고객관리 프로그램

로깅 로직-지금까지 벌어진 일을 기록하기 위한 로직과 여러 데이터를 관리하기 위한 데이터베이스 연결 로직이 포함됨

핵심 관점 - 계좌 이체, 고객 관리 로직

부가 관점 - 로깅, 데이터베이스 연결 로직

⇒ 위의 프로그램의 로직에 AOP 관점을 적용하면, 부가 관점에 해당하는 로직을 모듈화해 개발할 수 있게해줌. 따라서 프로그램의 확장과 변경에도 유연하게 대응

이식 가능한 서비스 추상화 (PSA)

  • Portable Service Abstraction의 줄인 표현으로 스프링에서 제공하는 다양한 기술들을 추상화해 개발자가 쉽게 사용하는 인터페이스
  • 예) 스프링에서 데이터베이스에 접근하기 위한 기술 JPA, MyBatis, JDBC 등

2.3 스프링부트3 둘러보기

import org.springframework.web.bind.annotation.*;

@RestController
public class TestController {
    @GetMapping("/test")
    public String test(){
        return "Hello world!";
    }
}

⇒ 사용자가 /test GET 요청을 하면 “Hello world!” 문자열을 반환해줌

  • /test: 코드에 @GetMapping 이라는 애너테이션으로 메서드와 매핑할 때 스프링부트에서 설정한 경로

스프링부트 스타터

  • 의존성이 모여있는 그룹으로 사용하면 필요한 기능을 간편하게 설정할 수 있음.
  • 스타터는 ‘spring-boot-starter-{작업유형}’라는 명명규칙이 존재함
스타터설명
spring-boot-starter-webSpringMVC를 사용해 RESTful 웹 서비스를 개발할 때 필요한 의존성 모음
spring-boot-starter-test스프링 애플리케이션을 테스트하기 위해 필요한 의존성 모음
spring-boot-starter-validation유효성 검사를 위해 필요한 의존성 모음
spring-boot-starter-actuator모니터링을 위해 애플리케이션에서 제공하는 다양한 정보를 제공하기 쉽게하는 의존성 모음
spring-boot-starter-data-jpaORM을 사용하기 위한 인터페이스의 모음인 JPA를 더 쉽게 사용하기 위한 의존성 모음

자동구성

  • 스프링부트에서는 애플리케이션이 최소한의 설정만으로도 실행되도록 여러 부분을 자동으로 구성함.
  • 스프링부트는 서버를 시작할 때 구성 파일을 읽어와서 설정하는데 이를 자동 설정이라고하며, META-INF에 있는 spring.factories 파일에 담겨있음.

스프링부트3와 자바 버전

⇒ 자바 17의 주요 변화 내용

  1. 텍스트 블록: 텍스트를 작성하려면 \n를 추가해야하지만, “””로 감싼 텍스트를 사용해 여러 줄의 텍스트 표현 가능

  2. formatted() 메소드: 값을 파싱하기 위해 제공.

    String textBlock17 = """
    {
    	"id": %d
    	"name": %s,
    }
    """.formatted(2, "juice")
  3. 레코드

    • 데이터를 전달하는 것을 목적으로 객체를 더 빠르고 간편하게 만들기위한 기능.
    • 레코드는 상속할 수 없고, 파라미터에 정의한 필드는 private final로 정의됨.
    • getter를 자동으로 만들기 때문에 애너테이션/메소드로 정의하지 않아도 됨.
    record Item(String name, int price) {
    	//이러면 파라미터가 private final로 정의됨)
    }
    
    Item juice = new Item("juice", 3000);
    juice.price();
  4. 패턴 매칭

    타입 확인을 위해 사용하던 instanceof 키워드를 조금 더 쉽게 사용하게 해줌.

  5. 자료형에 맞는 case 처리

    switch-case문으로 자료형에 맞게 case를 처리할 수 있음

2.4 스프링부트3 코드 이해하기

@SpringBootApplication 이해하기

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class SpringBootDeveloperApplication {

    public static void main(String[] args) {
        SpringApplication.run(SpringBootDeveloperApplication.class, args);
    }
}
  • 위의 애노테이션을 추가하면 스프링 부트 사용에 필요한 기본 설정을 해줌.
  • SpringApplication.run() 메소드는 애플리케이션을 실행함
  • 첫 번째 인수: 스프링부트3 애플리케이션의 메인 클래스로 사용할 클래스
  • 두 번째 인수: 커맨드 라인의 인수들을 전달

  1. @SpringBootConfiguration

    스프링부트 관련 설정을 나타내는 애너테이션. @Configuration 을 상속해서 만든 애너테이션.

  2. @ComponentScan

    사용자가 등록한 빈을 읽고 등록하는 애너테이션. @Component 라는 애너테이션을 가진 클래스들을 찾아 빈으로 등록하는 역할을 함.

    애너테이션명설명
    @Configuration설정 파일 등록
    @RepositoryORM 매핑
    @Controller, @RestController라우터
    @Service비즈니스 로직
  3. @EnableAutoConfiguration

    스프링부트에서 자동구성을 활성화하는 애너테이션. 즉, 스프링부트 서버가 실행될 때 스프링부트의 메타 파일을 읽고 정의된 설정들을 자동으로 구성하는 역할을 수행.

테스트 컨트롤러

  • @RestController 는 라우터 역할을 하는 애너테이션. 해당 애너테이션이 있어야 클라이언트의 요청에 맞는 메소드를 실행할 수 있음.
  • 라우터: HTTP 요청과 메소드를 연결하는 장치를 말함.

03장. 스프링부트3 구조 이해하기

  • TestController 클래스: 외부 요청을 분기하여 적절한 서비스를 클래스와 연결하여 작업을 처리하고 값을 반환
  • TestService 클래스: 데이터베이스 조작이나 비즈니스 로직을 메소드 기반으로 처리
  • Member 클래스 - MemberRepository: 멤버 클래스로 구현한 클래스를 멤버레포지토리 인터페이스가 실제 테이블과 매핑함

3.1 스프링부트3 구조 살펴보기

  • 스프링부트는 각 계층이 양 옆의 계층과 통신하는 구조.

스프링부트의 계층

프레젠테이션, 비즈니스, 퍼시스턴스 계층이 존재하며 서로 통신하며 프로그램 구성

  1. 프레젠테이션 계층

    HTTP 요청을 받고 비즈니스 계층으로 전송하는 역할을 함. 컨트롤러가 프레젠테이션 계층의 역할을 하며 스프링부트 내에 여러 개가 존재할 수 있음.

  1. 비즈니스 계층

    모든 비즈니스 로직(= 서비스를 만들기 위한 로직)을 처리. 즉, 웹 사이트에서 벌어지는 모든 작업을 처리함. 서비스가 비즈니스 계층의 역할을 함.

  1. 퍼시스턴스 계층

    모든 데이터베이스 관련 로직을 처리함. 이 과정에서 DB에 접근하는 DAO 객체를 사용할 수 있음. 리포지토리가 퍼시스턴스 계층의 역할을 함.

스프링부트 프로젝트 디렉토리

  • 디렉토리 구성
    • main: 실제 코드를 작성하는 공간. 프로젝트 실행에 필요한 소스 코드/리소스 파일이 존재
    • test: 프로젝트의 소스 코드를 테스트할 목적의 코드나 리소스 파일이 존재
    • build.gradle: 빌드를 설정하는 파일. 의존성이나 플러그인 설정 등과 같이 빌드에 필요한 설정 사용
    • settings.gradle: 빌드할 프로젝트의 정보를 설정.

- static 디렉토리: JS, CSS, 이미지와 같은 정적 파일을 넣는 용도
- application.yml 파일: 스프링부트 서버가 실행되면 자동으로 로딩되는 파일로 데이터베이스의 설정 정보, 로깅 설정 정보 등이 들어갈 수 있음.

3.2 스프링부트3 프로젝트 발전시키기

build.gradle에 의존성 추가

  • 데이터베이스의 테이블을 객체로 바꿔 가져오는 도구들
  • 앞은 구성, 뒤는 의존성 이름

프레젠테이션, 서비스, 퍼시스턴스 계층 만들기

실행

profile
이불 밖은 위험해.

0개의 댓글