Spring Boot: 스프링 부트 기초 [1]

hyeppy·2025년 8월 27일

Spring Boot

목록 보기
2/6
post-thumbnail

컨트롤러(Controller) 만들어서 URL 매핑(Mapping)하기


스프링 부트 프로젝트를 시작하고 아무것도 작성하지 않은 상태에서 서버를 구동하면 위와 같은 404 Not Found 오류 화면을 만날 수 있다. (type=Not Found, status=404)라는 메시지는 HTTP 오류 코드 중 하나로, 브라우저가 요청한 페이지를 찾을 수 없다는 뜻이다. 즉, 스프링 부트 서버가 http://localhost:8080/ 요청을 처리할 수 있는 컨트롤러가 없기 때문에 발생하는 오류이다.

컨트롤러와 URL 매핑

스프링 부트는 서버 역할을 하기 때문에, 클라이언트로부터 요청을 받으면 즉시 적절한 응답을 준비해야 한다.

  1. 클라이언트가 특정 URL로 요청
  2. 스프링 부트가 컨트롤러에서 해당 URL과 매핑된 메서드를 찾음
  3. 매핑된 메서드를 실행하여 응답 준비
  4. 클라이언트에게 응답 전송

이 과정이 정상적으로 동작하려면 URL이 컨트롤러 메서드와 매핑되어 있어야 하며, 이를 위해 컨트롤러 클래스를 작성해야 한다.

스프링 부트 프로젝트를 시작하고 아무것도 작성하지 않은 상태에서 서버를 구동 시 위와 같은 오류 화면을 만날 수 있다. (type=Not Found, status=404)라는 메시지는 HTTP 오류 코드 중 하나로, 브라우저가 요청한 페이지를 찾을 수 없다는 뜻이다. 즉, 스프링 부트 서버가 http://localhost:8080/라는 요청을 해석할 수 없기에 이와 같은 오류가 발생한 것이다.

컨트롤러 클래스를 만들고, @GetMapping 또는 @PostMapping과 같은 어노테이션을 적용하면 해당 URL과 메서드가 연결된다.

package com.mysite.sbb;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;

@Controller
public class MainController {
    @GetMapping("/sbb")
    public void index() {
        System.out.println("index");
    }
}

@Controller

  • 스프링 컨테이너에게 이 클래스가 웹 요청을 처리하는 컨트롤러 역할을 한다고 알려 줌
  • 스프링은 이 어노테이션을 통해 해당 클래스의 객체를 빈(Bean)으로 등록함

@GetMapping("/")

  • HTTP GET 요청의 경로와 메서드를 매칭함
  • @PostMapping, @PutMapping, @DeleteMapping 등 다른 HTTP 메서드도 지원

void 반환 타입의 문제점

위의 코드를 실행하면 여전히 오류가 발생한다. 이는 메서드가 void를 반환하기 때문인데, 이럴 경우 스프링은 다음과 같이 동작한다.

  1. 요청 경로와 같은 이름의 템플릿 파일(html, css 등)을 찾으려 시도
  2. 템플릿 파일이 없으면 500 Internal Server Error 발생
package com.mysite.sbb;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.ResponseBody;

@Controller
public class MainController {

    @GetMapping("/sbb")
    @ResponseBody
    public String index() {
        return "index";
    }
}

@ResponseBody

  • 메서드의 반환값을 HTTP 응답 본문에 직접 작성
  • 템플릿 파일을 찾지 않고, 반환된 문자열을 그대로 브라우저에 표시함
  • Json, XML 등 다양한 형태의 데이터도 반환 가능
  • 어노테이션 생략 시, 반환된 값을 뷰(View) 이름으로 인식하여 해당 이름의 템플릿 파일을 찾으려 시도하여 예상치 못한 결과 값을 반환하게 될 수 있음.

JPA로 데이터베이스 사용하기

데이터베이스(Database, 이하 DB)는 구조화된 데이터를 저장, 관리, 검색할 수 있는 저장소로, 현대의 대부분 웹 서비스는 사용자가 생성하는 다양한 데이터를 안전하고 효율적으로 관리하기 위해 DB를 활용한다. 하지만 자바와 데이터베이스 간에는 언어 차이 문제가 존재했는데,

  • 자바: 객체지향 방식의 Java 문법
  • 데이터베이스: SQL 문법만 이해 가능

이로 인해 자바 애플리케이션이 데이터베이스와 통신하기 위해선 복잡한 SQL을 작성해야 했다.

ORM(Object Relational Mapping)

객체(Object)와 관계형 데이터베이스(Relational Database) 간의 데이터를 자동으로 매핑(변환)해 주는 기술로, 자바와 DB 간의 언어 격차를 없애 준다.

따라서 ORM를 익히면 별도의 SQL 문법을 배우지 않아도 DB를 사용할 수 있기 때문에 매우 편리하다.

  • 자바에서 개발자가 작성하는 자바 코드
    User user = new User("김철수", 25);
    userRepository.save(user);
  • ORM의 자동 변환을 통해 실제로 데이터베이스에 실행되는 SQL문
    INSERT INTO users (name, age) VALUES ('김철수', 25);

ORM을 사용하면:

  • 개발 생산성 향상: SQL 작성 시간 단축
  • 코드 유지보수성 향상: 자바 코드만으로 데이터 처리 가능
  • 데이터베이스 독립성: 다양한 DB로 쉽게 변경 가능
  • 객체지향적 데이터 처리: 데이터를 객체로 직관적으로 다룰 수 있음

이와 같은 장점을 지니게 되며, 자바에는 다음과 같은 대표적인 ORM 기술이 있다.

JPA (Java Persistence API)

스프링 부트는 JPA를 ORM 기술의 표준으로 사용한다. JPA는 인터페이스 모음이므로, 이 인터페이스를 구현한 실제 클래스가 필요하다.

  • Hibernate (하이버네이트)
    • JPA의 가장 대표적인 구현체
    • JPA 인터페이스를 구현한 실제 클래스
    • 자바의 대표적인 ORM 프레임워크
    • 스프링 부트에서 기본적으로 사용
    • 데이터베이스 관리를 쉽게 도와줌
  • MyBatis
    • JPA, Hibernate와는 다른 방식의 ORM 기술
    • SQL 매퍼 방식의 ORM
    • SQL을 직접 작성하되 자바 객체와 자동 매핑
    • SQL에 대한 세밀한 제어가 필요한 경우 사용

JPA 환경 설정

자바 프로그램에서 JPA를 사용하여 데이터베이스에 데이터를 저장하거나 조회하려면 다음과 같은 설정이 필요하다.

  1. build.gradle 파일 수정

    1. Java 프로젝트 (build.gradle)

      dependencies {
          implementation 'org.springframework.boot:spring-boot-starter-data-jpa'
      }
    2. kotlin 프로젝트(build.gradle.kts)

      dependencies {
          implementation("org.springframework.boot:spring-boot-starter-data-jpa")
      }

    implementation이란?
    필요란 라이브러리 설치를 위해 가장 일반적으로 사용하는 설정으로, 해당 라이브러리가 변경되더라도 이 라이브러리와 연관된 모든 모듈을 컴파일하지 않고, 변경된 내용과 관련이 있는 모듈만 컴파일하므로 프로젝트를 리빌드(rebuild)하는 속도가 빠름

  2. application.properties or application.yml 수정

    1. application.properties

      // JPA
      spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.H2Dialect
      spring.jpa.hibernate.ddl-auto=update
    2. application.yml (권장)

      jpa:
       properties:
         hibernate:
           format_sql: true        # SQL을 보기 좋게 포맷팅하여 출력 (들여쓰기, 줄바꿈 등)
           highlight_sql: true     # 콘솔에서 SQL 구문을 색상으로 하이라이트 표시
           use_sql_comments: true  # SQL에 주석 추가하여 어떤 엔티티/메서드에서 생성된 쿼리인지 표시
       hibernate:
         ddl-auto: update         # 애플리케이션 시작 시 엔티티 변경사항을 DB 스키마에 자동 반영
       show-sql: true            # 실행되는 SQL 쿼리를 콘솔에 출력하여 확인 가능
      • 테스트 환경과 운영 환경의 데이터베이스를 분리하여 사용하지 않으면 데이터가 섞여 예상치 못한 동작을 유발할 수 있으므로, 반드시 분리하는 것을 권장.
        # 개발 환경
        spring:
          jpa:
            hibernate:
              ddl-auto: update    # 스키마 자동 업데이트
            show-sql: true        # SQL 쿼리 출력으로 디버깅
        
        # 운영 환경
        spring:
          jpa:
            hibernate:
              ddl-auto: none      # 수동 스키마 관리로 안전성 확보
            show-sql: false       # 성능상 SQL 출력 비활성화
      • 개발 중에는 ddl-auto: update 로 편리하게 사용하되, 운영 환경에서는 성능 저하 방지를 위해 비활성화 후 배포 권장.

H2 데이터베이스

스프링 부트는 MySQL, 오라클 DB, MSSQL 등 굵직한 DBMS를 연결해 사용하기도 하지만, 개발 시에는 자바 기반의 경량 DBMS인 H2 데이터베이스를 사용하여 빠르게 개발하고 실제 운영 시스템에는 앞서 말한 규모 있는 DBMS를 사용하는 것이 일반적이다.

https://wikidocs.net/161164
H2 데이터베이스 사용은 윗 링크 참조!


2-02 간단한 웹 프로그램 만들기

2-03 JPA로 데이터베이스 사용하기


profile
Backend

0개의 댓글