[Java] SpringBoot 시작

이현경·2025년 11월 21일

Spring 관련 기본 용어

Spring은 자바 기반의 강력한 웹 애플리케이션 개발을 위한 오픈소스 프레임워크로 설정이 복잡해서 초보자에겐 진입장벽이 크다. 그래서 등장한 것이 Spring Boot로 번거로운 설정 없이 간편하게 시작할 수 있는 Spring 프로젝트 템플릿이다. Spring 프레임워크를 기반으로 하지만, 복잡한 XML 설정 없이 어노테이션 기반으로 더 빠르고 직관적인 개발이 가능하다.
추가로 REST API는 Representational State Transfer API로, REST 원칙에 따라 설계된 웹 기반의 API이다. 여기서 REST는 웹에서 데이터를 주고받기 위한 표준화된 아키텍처 스타일로 HTTP 프로토콜을 기반으로 하며 자원을 기반으로 웹 서비스 간에 데이터를 교환하는 방식을 말한다. 이러한 REST 원칙을 엄격하고 충실히 따른 API를 특별히 RESTFul API라고 부른다.

REST 핵심 원칙

  1. 클라이언트-서버 구조: 클라이언트와 서버는 역할에 따라 명확히 분리된다
  2. 무상태성(Stateless): 서버는 요청 간의 상태를 저장하지 않는다. 즉, 각 요청은 독립적이며 이전 요청의 영향을 받지 않는다.
  3. 캐시 기능(Cacheable): 서버 응답은 캐시될 수 있어야 하며 이를 통해 성능을 높이고 불필요한 요청을 줄일 수 있다.
  4. 계층화된 시스템(Layered System): 클라이언트가 여러 개의 레이어로 된 서버를 거칠 수 있으나 서버의 내부 구조, 존재 유무를 몰라도 된다.
  5. 일관된 인터페이스(Uniform Interface): 모든 리소스는 일관된 방식으로 접근한다. 예를 들어, HTTP 메서드는 GET, POST, PUT, DELETE 등을 사용한다.
  6. 코드-온-디맨드(선택사항)
  • Spring Boot 언제 사용할까?

    • 사용자 인터페이스와 데이터, 처리 로직을 명확히 구분할 때
    • 화면, 로직, 제어흐름에 따라 역할별로 협업할 때
  • Spring Boot 왜 쓸까?

    • 스프링 부트에서 자동 구성 해줌
    • 표준화된 프로젝트 구조를 사용함



Spring Boot 기본 어노테이션

  • 핵심 어노테이션
    • @SpringBootApplication: 애플리케이션의 시작점. 여러 어노테이션을 조합한 대표 어노테이션
    • @RestController: JSON 등 REST API 응답을 반환하는 컨트롤러로 선언
    • @GetMapping: HTTP GET 요청을 처리하는 메서드에 사용
    • @PostMapping: HTTP POST 요청을 처리하는 메서드에 사용
    • @RequestMapping: GET/POST 등 다양한 HTTP 요청을 클래스/메서드에 매핑
    • @PathVariable: URL 경로 내 변수를 가져올 때 사용
    • @RequestParam: 쿼리 파라미터나 폼 데이터를 받아올 때 사용
    • @Autowired: 스프링이 자동으로 빈(Bean)을 주입해주는 의존성 주입 어노테이션
  • 계층형 어노테이션
    • @Component (공통): Spring Bean 등록, 다른 어노테이션의 상위 개념
    • @Service (비즈니스 로직): 서비스 계층을 나타내는 Component
    • @Repository (데이터 접근): DAO 역할
    • @Entity (데이터 모델): JPA에서 테이블과 매핑되는 클래스. 반드시 @Id 필드를 포함해야 함



Spring Boot의 핵심 원리

  • DI(의존성 주입, Dependency Injection)
    • 외부(프레임워크)에서 의존 객체를 전달(주입)받는 방식으로 의존성 관리를 프레임워크가 대신해주는 방식
    • @Autowired, 생성자 주입, Setter 주입으로 구현
  • IoC(제어의 역전, Inversion of Control)
    • 객체의 생성부터 생명주기 관리까지 모든 것을 개발자가 아닌, 프레임워크가 대신하는 원리
    • 개발자는 필요한 기능만 정의하고 나머지는 Spring에 맡김
    • DI는 IoC의 구현 방식 중 하나
  • 자동구성(Auto Configuration)
    • Spring Boot의 가장 강력한 기능 중 하나로, 어플리케이션 설정을 자동으로 구성함
    • @SpringBootApplication 안에는 자동구성을 활성화하는 @EnableAutoConfiguration이 들어있음
    • 클래스 경로와 Bean 설정, 속성들을 기반으로 적절한 설정을 자동으로 적용
    • Spring Bean: Spring 컨테이너가 관리하는 객체로 기본적으로 싱글톤임
      • @Component, @Service, @Repository, @Controller 등으로 등록됨



Spring Boot 프로젝트의 구조

아래와 같은 구조가 SpringBoot의 전형적인 구조이다.

ProjectName
├── src
│   ├── main
│   │   ├── java
│   │   │   └── com.example.demo       // 도메인 이름 거꾸로
│   │   │       ├── Application.java   // 실행 클래스, Root에 위치
│   │   │       ├── controller         // 요청 처리
│   │   │       ├── service            // 비즈니스 로직
│   │   │       ├── dto                // model, 요청,응답용 데이터 객체
│   │   │       ├── repository         // DB 접근
│   │   │       ├── domain             // JPA Entity
│   │   │       ├── config             // 설정 클래스
│   │   │       └── ...
│   │   └── resources 
│   │       ├── static
│   │       ├── templates
│   │       └── application.properties
│   └── test
├── build.gradle
└── ...

Spring Boot는 보통 com.회사명.프로젝트명 형태의 루트 패키지를 가진다. 모든 코드는 이 루트 패키지 아래에 만들어야한다.
Application.java에 main 메소드가 있고 @SpringBootApplication 어노테이션이 붙어있어 이곳이 시작점이 된다. controller는 요청을 전달하고 응답을 반환하는 역할로, @Controller@RestController 어노테이션을 사용한다. service는 비즈니스 로직을 처리하는 역할로, @Service 어노테이션을 사용한다. repository는 데이터베이스와의 통신을 하는 역할로, @Repository 어노테이션을 사용한다.

의존 방향은 다음과 같다.

Controller → Service → Repository → DB
                ↘           ↘
 ︎                DTO         Domain(Entity)



실습1

package kr.ac.ewha.java2;

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

import kr.ac.ewha.java2.controller.GreetingController;

@SpringBootApplication
public class HelloSpringApplication {
	public static void main(String[] args) {
		SpringApplication.run(HelloSpringApplication.class, args);
		System.out.println("Hello Spring!");
	}

}
package kr.ac.ewha.java2.controller;

import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class HelloController {
	@RequestMapping("/web")
	public String hello() {
		return "Hello Spring~!! ❤️❤️😊😊";
	}
	
	@RequestMapping("/java")
	public String hi() {
		return "Hello Java~!! 안녕안녕 ❤️❤️😊😊";
	}
}

@RequestMapping("/web")은 /web 요청이 왔을 때 hello()를 실행하도록 매핑해준다. @SpringBootApplication이 붙은 메인 클래스와 함께 실행하면 바로 동작한다. 실행 결과는 아래와 같다.

추가로 index.html을 만들어 실행시키면 다음과 같은 화면은 볼 수 있다. index.html은 웹 애플리케이션의 Welcome Page로, 사용자가 도메인의 루트 경로로 접속했을 때 서버가 가장 먼저 제공하는 정적 파일이다. Spring Boot에서는 별도의 컨트롤러 설정 없이 resources/static 폴더에 위치시키는 것만으로도 자동으로 맵핑되어 렌더링된다.



실습2

// HelloSpringApplication.java
@SpringBootApplication
public class HelloSpringApplication {
	private final GreetingController greetingController;
	
	HelloSpringApplication(GreetingController greetingController) {
		this.greetingController = greetingController;
	}
	
	public static void main(String[] args) {
		SpringApplication.run(HelloSpringApplication.class, args);
		System.out.println("start!");
	}
}

@Autowired를 이용해 GreetingService를 자동 주입하고 있다.

// GreetingController.java
@RestController
public class GreetingController {
	
	@Autowired // GreetingService를 자동으로 주입
	private GreetingService greetingService;
	
	@PostMapping("/hello")
	public String sayHello(@RequestParam(name="name") String name) {
		System.out.println(name);
		return greetingService.getGreeting(name);
	}
}

@Service를 이용해 new GreetingService()로 만들지 않고 Spring이 통제하도록 하였다.

// GreetingService.java
@Service
public class GreetingService {
	public String getGreeting(@RequestParam("name") String name) {
		return "안녕하세요😊 " + name + "님! 오늘도 과제가 잔뜩 남아계시는군요?ㅋ";
	}
}
<!-- user.html -->
<html>
<body>
	<meta charset="UTF-8">
	<form method<="post" action="http://localhost:8080/hello", accept-charset="UTF-8">
		<input type="text" name="name" value="현경" />
		<button type="submit">보내기</button>
	</form>
</body>
</html>




소감

이번 학기 자프실2를 들으며 디자인 패턴도 배우고 DI, IoC 이런것까지 배우고 스프링부트를 실습하니, 방학 때 책을 보며 이해되지 않았던 개념들이 제대로 이해되었다. 그때는 정말 한국말을 읽는데 외국어를 읽는 기분이었는데..ㅎㅎ 기본적인 어노테이션의 동작방식도 확실히 이해되고 이제 진짜 공부하는 느낌?이 든다. 내가 직접 url을 바꾸면서 실습하는 것도 나름의 재미가 있고 나중에 db 연결이나 CRUD 실습도 빨리 해보고 싶다^^ 스프링 부트 실습이 제일 재밌당😎

profile
커피 한 잔의 여유를 아는 품격있는 여자

0개의 댓글