Spring Boot 시작

Ckd gus·2026년 2월 2일

Spring Boot 기본 정리

Spring Boot는 Spring 프레임워크를 기반으로, Spring을 더 쉽고 빠르게 사용하기 위해 만들어진 도구이다.


start.spring.io로 프로젝트 생성

https://start.spring.io/

위 사이트에서 원하는 옵션을 설정해 프로젝트를 만들 수 있다.

  • Project: Gradle - Groovy
  • Language: Java
  • Spring Boot: 3.5.6
  • Packaging: Jar
  • Java: 21
  • Dependencies: Spring Web

설정 후 Generate를 클릭하면 압축 파일이 다운로드된다.
다운로드 받은 파일을 풀고, build.gradle 파일이 있는 폴더를 프로젝트로 열면 된다.


프로젝트 구조

  • build.gradle : Gradle 빌드 도구의 설정 파일
  • DemoApplication.java : Spring Boot 실행 클래스
  • application.properties : 애플리케이션 설정 파일 (yml로 변경 가능)

build.gradle 살펴보기

plugins 블록은 프로젝트에 필요한 Gradle 플러그인을 선언하는 곳이다.
repositories 블록은 의존성을 다운로드할 저장소를 지정하는 곳이다.
dependencies 블록은 프로젝트에 필요한 라이브러리를 선언하는 곳이다.

또한 dependencies 블록 안의 Spring Boot Starter는 특정 기능을 사용하기 위해 필요한 의존성을 묶어놓은 패키지라고 보면 된다.

예시:

plugins {
    id 'java'
    id 'org.springframework.boot' version '3.5.6'
    id 'io.spring.dependency-management' version '1.1.7'
}

group = 'org.example'
version = '0.0.1-SNAPSHOT'
description = 'iocexam'

java {
    toolchain {
        languageVersion = JavaLanguageVersion.of(21)
    }
}

repositories {
    mavenCentral()
}

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

tasks.named('test') {
    useJUnitPlatform()
}

@SpringBootApplication 어노테이션

Spring Boot 애플리케이션의 시작점을 표시하는 어노테이션이다.

예시:

@SpringBootApplication
@RestController
public class HellospringApplication {

    @GetMapping("/default")
    public String hello() {
        return "Hello Spring Boot! 111111111111";
    }

    @GetMapping("/spring")
    public String spring() {
        return "Hello Spring Boot! 2222222222222";
    }

    @GetMapping("/rnckdgus")
    public String rnckdgus() {
        return "나의 페이지 추가";
    }

    public static void main(String[] args) {
        SpringApplication.run(HellospringApplication.class, args);
    }
}

IoC와 DI, Bean

  • IoC(Inversion of Control)는 프로그램의 제어 흐름이 프레임워크에 의해 제어되는 것을 의미한다.
  • DI(Dependency Injection)는 IoC를 구현하는 구체적인 방법 중 하나이며, 의존성을 외부에서 주입받는 방식이다.
  • Bean은 IoC 컨테이너가 관리하는 객체이다.

Bean 등록 방식

Bean을 등록하는 방법은 크게 3가지가 있다.

1) @Component 어노테이션 사용
2) @Configuration + @Bean 사용
3) XML 설정 (레거시)

오늘은 Java Config 방식으로 Bean을 생성해본다.


Java Config로 Bean 생성

MyBean 클래스

public class MyBean {
    private String name;
    private int age;

    public MyBean() {
        System.out.println("MyBean 생성!");
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }
}

Config 클래스

@Configuration
public class MyBeanConfig {

    @Bean
    // @Scope("prototype")
    public MyBean mybean() {
        return new MyBean();
    }
}

ApplicationContext로 Bean 사용

System.out.println("공장 세우기 전");

ApplicationContext context =
        new AnnotationConfigApplicationContext(MyBeanConfig.class);

System.out.println("공장 세운 후");

MyBean mybean = (MyBean) context.getBean("mybean");
mybean.setName("koo");
System.out.println(mybean.getName());

의존성 주입(DI) 방법

의존성을 주입하는 방법은 아래와 같다.

1) 생성자를 통한 주입
2) 설정자(setter 메서드)를 통한 주입
3) 필드에 직접 주입 (비권장, 추후 어노테이션 방식에서 다룸)


기존 자바 코드와 비교

DI가 아닌 경우 (직접 생성)

public class Player {
    private Dice dice;

    public Player() {
        this.dice = new Dice();
    }
}

// 사용
Player player = new Player();

Dice 클래스 예시

public class Dice {
    private int face;

    public Dice() {
        System.out.println("Dice() 실행!!");
    }

    public Dice(int face) {
        this.face = face;
        System.out.println("Dice(int) 실행!!");
    }

    public void setFace(int face) {
        this.face = face;
    }

    public int getNumber() {
        return (int)(Math.random() * face) + 1;
    }
}

Setter로 DI 적용

public class Player {
    private Dice dice;

    public void setDice(Dice dice) {
        this.dice = dice;
    }
}

// 사용
Player player = new Player();
Dice dice = new Dice();
player.setDice(dice);

이렇게 의존성 주입을 통해 객체를 생성하면, 제어권을 외부에서 가지게 되고 결합도도 낮아진다.


느낀점

긴 명절 연휴를 끝내고 다시 수업이 시작되었다.

오랜만에 듣는 수업이라 뭔가 어색했지만 연휴를 이용해서 복습도 하고 공부도 조금씩 하다 보니 크게 어려움 없이 수업에 집중할 수 있었다.

오늘은 스프링부트를 시작하였다. 말로만 듣던 프레임워크를 사용한다고 하니 신기하기도 했고 배울 게 많아 무섭기도 한 감정으로 수업을 들었다.

첫 시간이라 내용이 많지는 않았지만 아직 아리송한 개념들이 많은 것 같다.

이러한 부분들은 차차 알아가도록 하고 배운 것들을 내 것으로 만드는 데 집중해야겠다.

오늘 회고조가 바뀌었다. 근데 전 회고조의 아는 분이 두 분이나 계셔서 좀 놀랐다. 2차 회고조는 5명이라 소수로 진행되는데 빠지지 말고 잘 들어야겠다.

profile
백엔드 공부중입니다.

0개의 댓글