springboot 9

[투두메이트 프로젝트] 공통 응답(Response) 객체 만들기

4/9 작성 투두메이트 프로젝트를 진행하던 중, 요청을 보냈을 때 성공이든 실패든 너무 단순한 응답만 받으니 직접 로그를 확인하는 등 디버깅에 불편을 느꼈다.에러가 나면 항상 같은 에러 메세지만 출력되고, 어떤 문제가 발생했는지 알기 위해선 로그를 직접 뒤져야 했다.요청이 성공해도 200OK만 떠서, 어떤 요청이 성공한 건지 명확하지 않았다. 혼자 개발하는데도 이렇게 불편한데, 협업 환경에서는 더 불편하겠다 싶었다. 남이 짠 코드를 테스트하거나 디버깅할 때 불필요하게 시간을 낭비하게 될 것 같다는 생각이 들었다...그래서 응답 객체를 통일해서 클라이언트와 서버 간의 소통을 더 명확히 하자는 생각이 들었다.이 글에서는 그렇게 만들게 된 공통 응답 Response 객체에 대해 정리해보겠다. 기존 postma..

토이프로젝트 2025.05.02

투두메이트 클론코딩 중, Todo의 status 기본값 설정 방법

투두메이트 클론 코딩 중, 새로운 todo를 만들 때 status 필드의 기본값을 설정해줘야 할 일이 생겼다. todo(할 일)의 status는 보통 PENDING(미완료)로 시작한다.이 기본값을 어디서 정해주는 게 좋은 방식일 지 고민하게 됐다.DB 테이블 생성 시 해당 필드에 default 설정 해주기Java 엔티티에서 변수 선언 시 기본값 설정하기생성자에서 기본값 설정하기Builder에서 기본값 설정하기 (@Builder + @Builder.Default)각 방법을 하나씩 살펴보자.1. DB 테이블 생성 시 해당 필드에 default 설정 해주기위처럼 todo 테이블을 생성할 때 status의 기본값을 pending으로 설정해주는 방식이다.DB에서 자동으로 기본값을 설정해 주지만,Java에서 생성되..

궁금한 것 2025.04.05

[SpringBoot] Transaction 트랜잭션

서비스 계층의 역할비즈니스 로직을 갖는다여러 SQL에 접속하는 경우 트랜잭션 관리트랜잭션이란?쪼갤 수 없는 업무의 최소 단위"모든 작업이 성공해야 최종적으로 적용됨"을 보장모든 SQL을 성공시키거나, 하나라도 실패하면 모두 실패시킴 MySQL 트랜잭션 명령어(SQL)start transaction;트랜잭션 시작하기commit;트랜잭션 정상 종료 (트랜잭션 시작 후 실행된 모든 SQL 한번에 반영)rollback;트랜잭션 실패 처리 (트랜잭션 시작 후 실행된 모든 SQL 미반영) 실습트랜잭션 실행 후, 테이블에 값 저장. 이 상태에서 다른 MySQL 창에서 해당 테이블의 정보를 검색하면트랜잭션이 시작된 후 아직 commit이나 rollback으로 이 트랜잭션의 반영 여부를 알려주지 않았기 때문에, 다른 단..

스프링부트 2025.03.10

[SpringBoot] Spring Data JPA를 사용한 CRUD

Spring Data JPA v.s. JPASpring Data JPA는 복잡한 JPA 코드를 스프링과 함께 쉽게 사용하도록 도와주는 라이브러리위의 함수들은 복잡한 JPA 코드를 감싼 코드임 전체 틀Spring Data JPA: JPA 사용JPA는 규칙일 뿐이고, 이를 구현한 Hibernate가 코드 역할을 하며Hibernate는 내부적으로 jdbc를 사용한다. 그래서 우리는 Srping Data JPA를 사용하면서 JDBC를 사용하고 있는 것Service에서 JpaRepository를 상속받은 Repository의 함수를 이용해서 CRUD 기능을 구현해보자사용할 repository 클래스가 JpaRepository를 상속받게 하면, 해당 repository는 굳이 @Repository를 붙이지 않아도,..

스프링부트 2025.03.10

[SpringBoot][DB] JPA (이용 배경, 개념, table과 객체 맵핑 실습)

JPA 이용 배경JdbcTemplate을 사용해서, 개발자가 문자열로 저장한 sql을 JdbcTemplate을 이용하여 데이터베이스에 던져주는 식으로 진행했을 때의 한계1. 문자열을 개발자가 직접 작성: 실수할 수 있고, 실수 인지 시점이 느림문자열 내부에서 나는 이 오류는 컴파일 시점이 아닌 런타임 시점에 잡히기 때문.*런타임 시점 오류와 컴파일 시점 오류에 대해서는 아래 글을 참고하세요https://mim-doremi.tistory.com/542. 특정 데이터베이스에 종속적이게 됨데이터베이스를 변경하고자 할 때, 작성했던 레포지토리 클래스를 하나하나 찾아가서 바꿔줘야 함.3. 반복 작업이 많아짐테이블 하나 생성 시 기본적으로 CRUD가 항상 필요한데, 이 쿼리들을 항상 작성해줘야 한다.4. 데이터베이..

스프링부트 2025.03.09

[SpringBoot] Spring Container

스프링 컨테이너란스프링 애플리케이션의 핵심 구성 요소로, 애플리케이션에 사용되는 빈 객체를 관리하는 역할을 한다. 애플리케이션의 시작과 종료, 객체의 생성과 소멸, 의존성 주입 등을 처리스프링 컨테이너의 주요 역할1. 빈 관리스프링 애플리케이션의 객체(빈)을 생성하고, 그 생명 주기를 관리빈을 스프링 컨테이너에 등록하고, 필요한 곳에 주입하여 객체 간의 의존성 문제를 해결2. 의존성 주입 (Dependency Injection)빈 객체 간의 의존성을 자동으로 주입@Autowired, 생성자 주입, 세터 등을 사용하여 빈을 주입받을 수 있다.3. 빈 생명 주기 관리빈의 생성, 초기화, 소멸 관리.4. 스코프(Scope) 관리빈의 스코프 관리.5. 컴포넌트 스캔 (Component Scan)애플리케이션에서 ..

스프링부트 2025.03.09

[SpringBoot] Layered Architecture: Controller, Service, Repository

Layered Architecture소프트웨어 시스템을 기능별로 여러 계층(Layer)로 분리하여 구성하는 아키텍처 패턴각 계층이 특정 역할을 담당다른 계층과 독립적으로 개발 및 관리: 특정 계층의 내부 구현을 변경해도 다른 계층에 미치는 영향이 최소화 -> 유지보수성 좋음Controller, Service, Repository로 구분되는 구조Controller클라이언트 요청을 받고, Service 계층을 호출하여 로직을 처리한 후, 결과를 응답하는 역할API가 진입하는 지점으로써, 요청으로 들어온 HTTP Body를 객체로 변환하는 역할Service비즈니스 로직을 담당하고, 데이터 처리 로직을 Repository 계층에 위임로직, 분기 처리, 예외 처리Repository데이터베이스와 직접적으로 소통하며..

스프링부트 2025.03.08

[DB] [Spring] Spring에서 Database 사용하기

스프링 부트가 데이터베이스(MySQL)에 접근할 수 있도록 해주는 방법프로젝트파일/src/main/resources에 application.yml이라는 파일을 생성해당 파일 내에 스프링부트가 데이터베이스에 붙을 수 있게 설정해 줄 것이다.spring: datasource: url: "jdbc:mysql://localhost/library" username: "root" password: "" driver-class-name: com.mysql.cj.jdbc.Driver  spring:spring boot의 설정을 정의하는 루트 키datasource:스프링부트가 어떤 데이터를 가리키게 할 것인지 설정하는 부분데이터베이스 연결과 ..

스프링부트 2025.03.05

스프링 프로젝트 시작하기

1. 이미 만들어져 있는 스프링 프로젝트를 다운받기프로젝트를 다운받아, IntelliJ로 실행2. spring initializr를 이용해 새로운 프로젝트 시작하기https://start.spring.io/*Language: 최신 프로젝트에서는 Kotlin을 사용하는 경향이 있지만, Java로 만들어진 기존 프로젝트가 많이 존재 *스프링부트 버전: 알파벳이 붙어 있으면, 개발 중이거나 오픈 베타라는 의미*Packaging: Spring Boot에는 톰캣이 내장되어 있어 Jar을 선택하면 됨  의존성 부분*의존성: 프로젝트에서 사용하는 라이브러리나 프레임워크를 의미라이브러리란?프로그래밍을 개발할 때 미리 만들어져 있는 기능을 가져다 사용하는 것프레임워크란?프로그래밍을 개발할 때 미리 만들어져 있는 구조에 ..

스프링부트 2025.02.27