
의존성 확인plugins { id 'java' id 'org.springframework.boot' version '3.2.10' id 'io.spring.dependency-management' version '1.1.6'}group = 'com.tenco'version = '0.0.1-SNAPSHOT'java { toolchain { languageVersion = JavaLanguageVersion.of(17) }}configurations { compileOnly { extendsFrom annotationProcessor }}repositories { mavenCentral()}dependencies { implementation 'org.springframework.boot:spring-b..

Mustache거의 로직이 없는 템플릿 엔진 다양한 프로그래밍 언어에서 사용할 수 있으며, 간단하고 유지보수가 용이한 템플릿을 만드는 데에 유용 Spring Boot와 Mustache를 결합함으로써개발자는 백엔드 로직과 프론트엔드 표현을 분리하여 더 효율적이고 관리하기 쉬운 웹 어플리케이션을 구축할 수 있습니다. Mustache의 주요 특징로직을 최소화한 템플릿(Logic-less templates): Mustache 템플릿은 복잡한 로직을 최소화하여, 템플릿 내에서 간단한 조건문과 반복문을 지원합니다. 이는 데이터를 표시하는 데에 집중하도록 설계되었습니다.예시 코드{{#users}} {{name}} 님이 로그인했습니다.{{/users}}{{^users}} 로그인한 사용자가 없습니다.{{/users..
템플릿 엔진 (Template Engine) 정적 파일(예: HTML, XML 등)을 동적으로 변환할 수 있는 도구 서버에서 데이터를 받아서 동적인 콘텐츠를 생성하기 위해 템플릿 파일에 변수나 표현식을 삽입해 처리하는 역할 이를 통해 서버가 클라이언트에 동적 웹 페이지를 응답할 수 있게 됩니다. 역할동적 웹 페이지 생성: 서버에서 HTML 템플릿 파일을 가져와, 서버에서 처리된 데이터를 삽입하여 클라이언트에게 동적인 웹 페이지를 전송합니다.코드 재사용성: 여러 웹 페이지에서 동일한 구조나 디자인을 사용하는 경우, 템플릿 엔진을 사용하면 공통된 레이아웃을 쉽게 재사용할 수 있습니다. 템플릿 엔진의 종류서버사이드 템플릿 엔진(SSR): 서버에서 HTML을 렌더링하고, 데이터가 삽입된 HTML을 클라이언트에게..

Article 코드 추가 // 객체의 상태값 수정 public void update(String title, String content) { // 유효성 검사 반드시 진행해야 함. // 즉, 데이터가 엔티티에 저장되기 전에 반드시 검증 if(title == null || title.trim().isEmpty()) { throw new Exception400("제목은 null이거나 빈 문자열일 수 없습니다."); } if(content == null || content.trim().isEmpty()) { throw new Exception400("내용은 null이거나 빈 문자열일 수 없습니다."); } this.title = title; this.content = conten..

BlogService 코드 추가public Article findById(Integer id) { // Optional 는 JAVA 8에서 도입된 클래스이며, // 값이 존재할 수도 있고 없을 수도 있는 상황을 명확하게 처리하기 위해 사용된다. return postRepository.findById(id).orElseThrow(() -> new Exception400("해당 게시글이 없습니다.")); // Optional 반환 -> Optional(Article)의 orElseThrow() 사용 // 데이터가 없으면 예외 떨어짐 } Optional (Optional을 사용하여 null 처리를 안전 처리 하기 위함)값이 존재할 때: Optional 안에 값이 포함되어 있으며, 이 ..

BlogService 코드 추가 // 전체 게시글 조회 기능 public List findAll() { List articles = postRepository.findAll(); // ListCrudRepository가 findAll() 제공 return articles; } ApiUtil공통 응답 DTO 생성package com.example.demo.common;import lombok.Data;@Datapublic class ApiUtil { private Integer status;// 응답 상태 코드 저장(200, 400, 500) private String msg; // 응답 메시지 저장(성공, 실패 문자열) // 변수명은 동일하나 데이터 타입이 달라져야 할 때 -> 제네릭 클래스 설계..

DTO (Data Transfer Object)는 데이터 전송을 위한 객체로, 주로 계층 간 데이터 교환을 목적으로 사용됩니다.예를 들어, 클라이언트에서 서버로 혹은 서비스 계층에서 프레젠테이션 계층으로 데이터를 전달할 때 사용됩니다.ArticleDTO 생성package com.example.demo._domain.blog.dto;import com.example.demo._domain.blog.entity.Article;import lombok.AllArgsConstructor;import lombok.Getter;import lombok.NoArgsConstructor;@NoArgsConstructor@AllArgsConstructor@Getter// 즉, 주로 계층 간의 데이터 전송 목적으로 설계된..

레포지토리 인터페이스를 만들기인터페이스 선언 방법과, 기본적인 CRUD 기능을 자동으로 제공받기 위한 JpaRepository 상속 구조를 이해한다.JpaRepository의 역할과 계층 구조 이해JpaRepository의 상속 계층(Repository → CrudRepository → PagingAndSortingRepository → JpaRepository)과 각 인터페이스의 역할을 이해한다. 스프링이 레포지토리 구현체를 자동으로 생성하는 개념 이해스프링이 JpaRepository 인터페이스의 구현체를 런타임 시에 자동으로 생성하여 제공하는 방식에 대해 설명할 수 있다. PostRepositorypackage com.example.demo._domain.blog.repository;import ..

스프링 부트와 JPA 프로젝트에서 패키지 구조를 구성하는 트렌드는 도메인 주도 설계(Domain-Driven Design, DDD)의 원칙을 사용하는 사례가 많이 보인다. 이는 애플리케이션의 구조를 기능이나 역할에 따라 나누기보다는, 도메인 중심으로 나누어 애플리케이션의 유지보수성과 확장성을 높이려는 의도나 방식이다. (여기서 도메인은 애플리케이션이 해결하려는 특정 비즈니스 문제나 현실 세계의 문제를 의미한다. 예를 들어, 은행 애플리케이션에서 "계좌", "고객", "거래"는 중요한 비즈니스 개념이며, 이것들이 바로 그 애플리케이션의 "도메인" 이 된다.) DDD 방식의 프로젝트 구조만들어 보기1. 도메인별로 패키지 구성각 도메인에는 그 도메인과 관련된 모든 엔티티, 서비스, 레포지토리, DTO 등이..

REST API (Representational State Transfer Application Programming Interface) 네트워크 상에서 자원을 요청하고 조작하기 위한 아키텍처 스타일 주로 HTTP 프로토콜을 기반으로 하며,클라이언트와 서버 간의 통신을 단순하고 효율적으로 수행할 수 있도록하는 표준화 된 약속입니다. REST API의 주요 특징무상태성 (Statelessness): 각 요청은 독립적이며, 서버는 클라이언트의 상태를 저장하지 않습니다. 모든 요청에는 필요한 모든 정보가 포함되어 있어야 합니다.클라이언트-서버 구조: 클라이언트와 서버는 서로 독립적으로 동작하며, 클라이언트는 요청을 보내고 서버는 그에 대한 응답을 제공합니다.자원 기반: API는 자원(데이터)에 대해 동작하며..