RECENT POSTS

최근에 작성한 글

01 / 03

전체 글

전체 보기

[TIL]Spring Boot 입문(2)- 테스트 코드부터 JPA까지

오늘은 Spring Boot의 기본 구조와 데이터 처리 방식에 대해 학습했다. 테스트 코드, HTTP 요청 처리, SQL/JDBC, 3 Layer Architecture, IoC/DI, JPA까지 전체적인 흐름을 공부해보았다.


1. 테스트 코드(Test Code)

개발 과정에서 버그를 최대한 빠르게 발견하기 위해 테스트 코드가 필요하다.

테스트 코드의 장점

  • 예상 결과와 실제 결과를 자동으로 비교 가능
  • 배포 전 검증 가능
  • 리팩토링 시 안정성 확보
  • 반복 테스트 자동화 가능

JUnit

Spring Boot 프로젝트에는 기본적으로 JUnit 환경이 설정되어 있어 테스트 코드를 쉽게 작성할 수 있다. 테스트를 통해 기능이 정상 동작하는지 지속적으로 검증할 수 있다.


2. Lombok

Lombok은 반복적으로 작성해야 하는 코드를 자동 생성해주는 라이브러리이다.

자주 사용하는 어노테이션

@Getter

@Getter
public class Memo {
    private String username;
    private String contents;
}

Getter 메서드를 자동 생성한다.

@Setter

@Setter
public class Memo {
    private String username;
    private String contents;
}

Setter 메서드를 자동 생성한다.

@NoArgsConstructor

기본 생성자 생성(인자가 없음!!)

@AllArgsConstructor

모든 필드를 파라미터로 받는 생성자 생성

@RequiredArgsConstructor

@RequiredArgsConstructor
public class Memo {
    private final String username;
    private final Calculator calculator;
}

final 필드만 포함하는 생성자를 생성한다. DI 환경에서 매우 자주 사용된다.


3. 정적 페이지와 동적 페이지

정적 페이지

resources/static

폴더에 html 파일을 두면 Spring Boot가 직접 제공한다.

예)

http://localhost:8080/hello.html

동적 페이지

동적 페이지는 Controller와 Template Engine(Thymeleaf)을 통해 생성된다.

@GetMapping("/html/templates")
public String hello() {
    return "hello";
}
resources/templates/hello.html

을 찾아 렌더링한다.


4. Jackson

Spring에서 JSON 데이터를 처리할 때 사용하는 라이브러리이다.

Object → JSON

ObjectMapper objectMapper = new ObjectMapper();

String json =
    objectMapper.writeValueAsString(star);

JSON → Object

Star star =
    objectMapper.readValue(json, Star.class);

조건

Object → JSON

  • Getter 필요

JSON → Object

  • 기본 생성자 필요
  • Getter 또는 Setter 필요

Spring Boot는 Jackson을 기본적으로 제공하므로 별도 설정 없이 JSON 변환이 가능하다.


5. Path Variable & Request Param

클라이언트가 서버에 데이터를 전달하는 대표적인 방법이다.

Path Variable

URL 경로 자체에 데이터를 포함

@GetMapping("/star/{name}/age/{age}")
public String hello(
    @PathVariable String name,
    @PathVariable int age
)

예시

/star/Robbie/age/95

Request Param

쿼리 스트링 사용

@GetMapping("/hello")
public String hello(
    @RequestParam String name,
    @RequestParam int age
)

예시

/hello?name=Robbie&age=95

두 방식 모두 자주 사용되므로 차이를 이해해야 한다.


6. HTTP 데이터를 객체로 받기

@ModelAttribute

Form 데이터를 객체로 변환

@PostMapping("/form/model")
public String hello(
    @ModelAttribute Star star
)

전달 데이터

name=Robbie&age=95

↓

Star {
    name = Robbie
    age = 95
}

Spring이 자동으로 매핑해준다.


7. SQL

SQL은 관계형 데이터베이스를 다루기 위한 언어이다.

DDL (구조 정의)

  • CREATE
  • ALTER
  • DROP
  • TRUNCATE

DML (데이터 조작)

  • INSERT
  • SELECT
  • UPDATE
  • DELETE

DCL (권한 관리)

  • GRANT
  • REVOKE

데이터를 저장하고 조회하기 위해 반드시 익혀야 하는 기본 문법이다.


8. JDBC

JDBC(Java Database Connectivity)는 Java에서 DB와 통신하기 위한 표준 API이다.

DB 작업 흐름

1. DB 연결
2. SQL 실행
3. 결과 반환

JDBC가 없었다면 DB마다 연결 방식을 모두 다르게 작성해야 했지만, JDBC 인터페이스를 통해 드라이버만 교체하면 동일한 코드로 DB를 변경할 수 있다.

예)

MySQL
↓
PostgreSQL

드라이버만 교체 가능하다.


9. 3 Layer Architecture

초기에는 Controller 하나에 모든 로직을 작성하지만 규모가 커질수록 유지보수가 어려워진다.

이를 해결하기 위해 역할을 분리한다.

Client
  ↓
Controller
  ↓
Service
  ↓
Repository
  ↓
Database

Controller

  • 요청 수신
  • 응답 반환

Service

  • 비즈니스 로직 처리

Repository

  • DB 접근
  • CRUD 수행

역할을 분리함으로써 유지보수성과 가독성이 향상된다.


10. IoC와 DI

Spring의 핵심 개념이다.

IoC (Inversion of Control)

객체 생성과 관리를 개발자가 직접 하지 않고 Spring이 대신 수행하는 것

DI (Dependency Injection)

필요한 객체를 외부(Spring)가 주입하는 것

예를 들어

private final MemoRepository memoRepository;

를 직접 생성하지 않고 Spring이 넣어준다.

장점

  • 결합도 감소
  • 유지보수 용이
  • 테스트 작성 편리

좋은 객체지향 설계를 가능하게 하는 핵심 개념이다.


11. IoC Container와 Bean

Bean

Spring이 관리하는 객체

IoC Container

Bean을 관리하는 저장소

Bean 등록

@Service
public class MemoService {
}

또는

@Component
public class MemoService {
}

의존성 주입

@RequiredArgsConstructor
@Service
public class MemoService {

    private final MemoRepository memoRepository;
}

Spring이 자동으로 Repository Bean을 주입해준다.

현재는 생성자 주입 방식이 가장 권장되는 방식이다.


12. JPA

JPA(Java Persistence API)는 Java ORM 표준 명세이다.

기존 JDBC 방식에서는

INSERT SQL 작성
SELECT SQL 작성
ResultSet 매핑

등을 직접 처리해야 했다.

하지만 JPA를 사용하면 객체 중심으로 DB를 다룰 수 있다.

ORM(Object Relational Mapping)

Java 객체
↔
DB 테이블

매핑을 자동 처리한다.

장점

  • SQL 작성 감소
  • 유지보수성 향상
  • 생산성 증가
  • 객체 중심 개발 가능

Spring Boot에서 데이터베이스를 다룰 때 가장 핵심적인 기술 중 하나이다.


오늘 느낀 점

오늘은 단순히 Spring 문법을 배우는 것이 아니라 Spring이 왜 등장했는지, 그리고 개발자가 반복적으로 하던 작업들을 어떻게 자동화해주는지 이해할 수 있었다.

특히 3 Layer Architecture → IoC/DI → Bean → JPA로 이어지는 흐름이 연결되면서 Spring이 단순한 라이브러리가 아니라 생산성과 유지보수성을 높이기 위한 프레임워크라는 점을 알게 되었다.