JPA

블로그 프로젝트 만들기

yoooon1212 2024. 10. 1. 11:01

REST API
(Representational State Transfer Application Programming Interface)

 

네트워크 상에서 자원을 요청하고 조작하기 위한 아키텍처 스타일

 

주로 HTTP 프로토콜을 기반으로 하며,

클라이언트와 서버 간의 통신을 단순하고 효율적으로 수행할 수 있도록하는 표준화 된 약속입니다.

 

REST API의 주요 특징

  • 무상태성 (Statelessness): 각 요청은 독립적이며, 서버는 클라이언트의 상태를 저장하지 않습니다. 모든 요청에는 필요한 모든 정보가 포함되어 있어야 합니다.
  • 클라이언트-서버 구조: 클라이언트와 서버는 서로 독립적으로 동작하며, 클라이언트는 요청을 보내고 서버는 그에 대한 응답을 제공합니다.
  • 자원 기반: API는 자원(데이터)에 대해 동작하며, 각 자원은 고유한 URI를 통해 식별됩니다. 자원은 예를 들어 사용자, 파일, 게시물 등이 될 수 있습니다.
  • HTTP 메서드 사용:
    • GET: 자원을 조회할 때 사용
    • POST: 새로운 자원을 생성할 때 사용
    • PUT: 기존 자원을 업데이트할 때 사용
    • DELETE: 자원을 삭제할 때 사용
  • 표현의 다양성: JSON, XML 등 다양한 형식으로 데이터를 주고받을 수 있으며, 대부분의 REST API는 가볍고 직관적인 JSON 포맷을 선호합니다.

 

프로젝트 생성

 

 

build.gradle
plugins {
	id 'java'
	id 'org.springframework.boot' version '3.2.10'
	id 'io.spring.dependency-management' version '1.1.6'
}

group = 'com.example'
version = '0.0.1-SNAPSHOT'

java {
	toolchain {
		languageVersion = JavaLanguageVersion.of(21)
	}
}

configurations {
	compileOnly {
		extendsFrom annotationProcessor
	}
}

repositories {
	mavenCentral()
}

dependencies {
	implementation 'org.springframework.boot:spring-boot-starter-data-jpa'
	implementation 'org.springframework.boot:spring-boot-starter-web'
	compileOnly 'org.projectlombok:lombok'
	developmentOnly 'org.springframework.boot:spring-boot-devtools'
	runtimeOnly 'com.h2database:h2'
	//runtimeOnly 'com.mysql:mysql-connector-j'
	annotationProcessor 'org.projectlombok:lombok'
	testImplementation 'org.springframework.boot:spring-boot-starter-test'
	testRuntimeOnly 'org.junit.platform:junit-platform-launcher'
}


tasks.named('test') {
	useJUnitPlatform()
}

 

 

의존성 범위 지정(Dependency Scope) 확인

implementation: 애플리케이션 컴파일 및 런타임 시 필요한 의존성.
compileOnly: 컴파일 시에만 필요한 의존성, 런타임 시 포함되지 않음.
developmentOnly: 개발 중에만 필요한 의존성, 프로덕션 빌드에는 포함되지 않음.
runtimeOnly: 런타임 시에만 필요한 의존성, 컴파일 시에는 필요하지 않음.
annotationProcessor: 컴파일 시에 어노테이션 프로세싱에 필요한 의존성. (컴파일 과정 중에 특정 어노테이션을 해석하고, 그에 따라 추가적인 코드를 생성하거나 검증하는 작업)
testImplementation: 테스트 코드의 컴파일 및 실행 시 필요한 의존성.
testRuntimeOnly: 테스트 실행 시에만 필요한 의존성, 컴파일 시에는 필요하지 않음.

 

 

빌드 시스템이란?

빌드 시스템은 소프트웨어 개발에서 소스 코드를 실행 가능한 프로그램으로 변환하는 일련의 과정을 자동화하는 도구 또는 프로세스를 말합니다.

  1. 컴파일:
    • 개발자가 작성한 소스 코드를 기계가 이해할 수 있는 바이트 코드 또는 기계어로 변환하는 과정입니다. ( 자바 소스 파일(.java)을 컴파일하여 .class 파일로 변환)
  2. 의존성 관리:
    • 프로젝트에서 사용하는 외부 라이브러리(예: JUnit, Spring 등)를 자동으로 다운로드하고, 적절한 버전을 유지하며, 이를 프로젝트에 포함시킵니다. (Gradle, Maven 같은 도구 사용)
  3. 패키징:
    • 컴파일된 소스 코드와 함께 필요한 파일(리소스, 설정 파일 등)을 하나로 패키징하여 배포 가능한 형태로 만듭니다. (자바 프로젝트의 경우 JAR(Java ARchive) 파일을 생성)
  4. 테스트 자동화:
    • 코드가 작성되면, 빌드 시스템은 자동으로 테스트를 실행하여 코드가 올바르게 동작하는지 확인합니다. (Gradle이나 Maven에서 JUnit 테스트를 자동으로 실행)
  5. 배포:
    • 빌드가 완료되면, 프로그램을 서버나 배포 환경에 자동으로 배포하는 기능을 지원할 수 있습니다.(CI/CD 도구와 연계하여 애플리케이션을 클라우드 환경에 배포)

GradleMaven은 대표적인 빌드 시스템 도구로, 각각 의존성 관리, 컴파일, 테스트, 패키징, 배포 등의 작업을 자동화하는 데 사용됩니다.

 

 

application.yml

spring:
  application:
    name: class_blog_jpa_v1

  server:
    port: 8080
  
  datasource:
    url: jdbc:mysql://localhost:3306/jpa_demo?useSSL=false&serverTimeZone=Asia/Seoul
    driver-class-name: com.mysql.cj.jdbc.Driver
    username: root 
    password: asd123

  profiles:
    active: dev  # 기본 활성화 프로파일을 dev로 설정

 

 

application-dev.yml
server:
  servlet:
    encoding:
      charset: utf-8         # 요청 및 응답에 UTF-8 인코딩을 사용하여 한글 및 특수문자가 깨지지 않도록 설정
      force: true            # 강제로 UTF-8 인코딩을 적용, 클라이언트가 다른 인코딩을 요청하더라도 무시하고 UTF-8을 사용
  port: 8080                 # 서버가 8080 포트에서 실행되도록 설정

spring:
  mustache:
    servlet:
      expose-session-attributes: true  # Mustache 템플릿에서 세션 속성에 접근할 수 있도록 허용
      expose-request-attributes: true  # Mustache 템플릿에서 요청 속성에 접근할 수 있도록 허용
  datasource:
    driver-class-name: org.h2.Driver    # 데이터베이스 드라이버로 H2 DB를 사용
    url: jdbc:h2:mem:testdb;MODE=MySQL    # H2 인메모리 데이터베이스를 MySQL 호환 모드로 사용 (테스트용)
    username: sa                        # 데이터베이스 연결 시 기본 사용자 이름
    password:                           # 데이터베이스 기본 비밀번호 (비어 있음)
  h2:
    console:
      enabled: true   # H2 데이터베이스 콘솔을 활성화하여 브라우저에서 데이터베이스를 관리할 수 있도록 함
  #sql:
    #init:
      #data-locations:
        #- classpath:db/data.sql  # 애플리케이션 초기화 시 실행할 데이터 삽입 SQL 파일의 경로 (data.sql)
  jpa:
    hibernate:
      ddl-auto: create            # 애플리케이션이 시작될 때 데이터베이스 테이블을 자동으로 생성
    show-sql: true                # Hibernate가 실행하는 SQL 쿼리를 콘솔에 출력
    properties:
      hibernate:
        format_sql: true          # 출력되는 SQL 쿼리를 포맷팅하여 읽기 쉽게 출력
    defer-datasource-initialization: true  # 데이터베이스 초기화가 지연되도록 설정하여 JPA 설정 후에 데이터 초기화

  output:
    ansi:
      enabled: always  # 콘솔 출력 시 ANSI 색상을 항상 사용하도록 설정 (색상을 통해 로그를 더 쉽게 구분 가능)

logging:
  level:
    '[com.example.class_blog_jpa_v1]': DEBUG  # 특정 패키지(com.tenco.blog_jpa_step1) 수준에서 DEBUG 레벨로 로깅을 설정

 

 

실행 결과 

 

Hibernate가 실행하는 sql 쿼리가 콘솔에 출력되는 것을 확인할 수 있습니다.