카테고리 없음

SpringBoot 입문!

hojin98 2026. 2. 3. 21:03

 

 

"API란?"

 

 

Application Programming Interface의 약자로, 프로그램끼리 대화하는 방법이다.

레스토랑의 메뉴판 처럼 어떤 요청을 할 수 있고 어떤 응답을 받을 수 있는지 정의한다.

 

 

 


RESTful API

 

REST는 어떻게 서버 구현을 알지 못하는 클라이언트가 API를 잘 이용할 수 있을지에 대한 고민의 결과물

 

1. /users/items/1

2. asJnkA_sgd/dPPk12/cczz

 

1번과 2번중 1번 API가 훨씬 이해하기 쉽고, 어떤 역할을 할 지 예상이 가능하다.

 

RESTful은 반드시 지켜야한다까지는 아니다.

 

 

 

 

RESTful API 디자인 원칙

 

 

1. 동사보단 명사를, 단수보단 복수를 사용한다.

 

  • /members/items >> O
  • /member/get/item/hello >> X

 

 

2. 마지막에 / (슬래시) 넣지 않기

 

  • /members/ >> X
  • /members >> O

 

3. _(언더바)대신 -(하이픈)사용 + 대문자 사용하지 않기

 

  • /restful-services >> O
  • /resful_services >> X

 

4. 확장자 포함하지 않기 (svg, png, exe등등)

 

  • /images >> O
  • /imagers.svg >> X

 

5. 계층화 하기

 

  • /members/{memberId}/items/{itemId} >> O
  • /items/{memberId}/members/{itemId} >> X

 

 


 

 

"마법의 스티커, 어노테이션 이란?"

 

 

주석처럼 프로그래밍 언어에 영향을 미치지 않으며, 유용한 정보를 제공한다.

 

 

어노테이션(@)은 스티커와 같다.

컴퓨터나 프로그램에게"이 코드는 특별한 녀석이니까 이렇게 처리해줘" 라고 몰래 알려주는 "비밀 쪽지"

 

 

 

"메타 어노테이션"

 

어노테이션을 만들 때 사용하는 어노테이션, java.lang.annotation패키지에 포함

 

 

어노테이션 설명
@Target 어노테이션이 적용 가능한 대상을 지정하는데 사용
@Documented 어노테이션 정보가 javadoc으로 작성된 문서에 포함되게 한다.
@Inherited 어노테이션이 자손 클래스에 상속되도록 한다.
@Retention 어노테이션이 유지되는 범위를 지정하는데 사용한다.
@Repeatable 어노테이션을 반복해서 적용할 수 있게 한다.

 

 

 

 

1. @Target

 

  • 어노테이션을 정의할 때 적용대상 지정에 사용

 

대상 타입 의미
ANNOTATION_TYPE 어노테이션
CONSTRUCTOR 생성자
FIELD 필드(멤버 변수, enum상수)
LOCAL_VARIABLE 지역 변수
METHOD 메서드
PACKAGE 패키지
PARAMETER 매개변수
TYPE 타입(클래스, 인터페이스, enum)
TYPE_PARAMETER 타입 매개변수
TYPE_USE 타입이 사용되는 모든 곳

 

 

 

 

2. @Retention

 

  • 어노테이션이 유지(retention)되는 기간을 지정하는데 사용
  • 컴파일러에 의해 사용되는 어노테이션의 유지 정책은 SOURCE이다.
    • ex) @Override - 오버라이딩을 올바르게 했는데 컴파일러가 체크(실행시 필요X)
  • 실행시에 사용 가능한 어노테이션의 정책은 RUNTIME이다.
    • @FunctionnalInterface - 클래스 파일에 존재하기 때문에, 컴파일러가 제대로 작성이 되었는지 체크도 해주지만, 런타임까지 살아있음

 

유지 정책 의미
SOURCE 소스 파일에만 존재, 클래스 파일에는 존재하지 않음
CLASS 클래스 파일에 존재, 실행시에 사용불가, 기본값
RUNTIME 클래스 파일에 존재, 실행시에 사용가능

 

 

3. @Documented

 

  • javadoc으로 작성한 문서에 포함시킬 때 사용하는 어노테이션

 

4. @Inherited

 

  • 어노테이션을 자손 클래스에 상속하고자 할 때 사용하는 어노테이션

 

 

 

 


Lombok 라이브러리

 

 

롬복은 보일러 플레이트 코드를 줄여주는 라이브러리로 자동으로 보일러 플레이트 코드를 생성하여

코드의 가독성과 유지보수성을 높여준다.

 

Lombok은 어노테이션 기반으로 동작하며, 주로 컴파일 시점에 소스 코드를 변환하여 필요한 메서드를 자동으로 생성한다.

 


 

보일러 플레이트 코드(Boilerplate code)란?

 

getter/setter 메서드, 생성자, toString 메서드 등과 같이 반복적으로 작성되는 코드를 뜻한다.

 

 

 

 

 

 

Lombok 라이브러리의 주요 어노테이션

 

  • @Getter
  • @Setter

클래스의 모든 필드에 대한 getter와 setter를 자동으로 생성해준다.

 

@Getter
@Setter
public class User {
    private String name;
    private int age;
  
  /** 아래 코드를 @Getter, @Setter 어노테이션이 생성해준다.
    public String getName() {
	    return name;
    }

    public void setName(String name) {
	    this.name = name;
    }
    
    public int getAge() {
	    return age;
    }

    public void setAge(int age) {
	    this.age = age;
    }
    **/
}

 

 

  • @ToString

toString( ) 메서드는 객체를 String으로 변환해주는 역할을 수행한다.

객체의 toString( ) 메서드를 자동으로 생성한다.

기본적으로 클래스의 모든 필드를 포함하며, 특정 필드를 제외하거나 포맷을 지정할 수 있다.

 

@ToString
public class User {
    private String name;
    private int age;
}

 

 

  • @NoArgsConstructor

말 그대로 인자(Argument)가 없는(No) 생성자(Constructor)를 자동으로 생성해주는 어노테이션

 

주로 Entity를 만들 때 사용,

@NoArgsConstructor(access = AccessLevel.PROTECTED) >> 생성자의 접근 레벨을 Protected로 하겠다

 

 

  • @AllArgsConstructor

클래스에 선언된 모든 필드를 인자로 받는 생성자를 롬복이 대신 작성해주는 어노테이션

보일러 플레이트 코드를 제거하는데 용이하고, 서비스나 컨트롤러에서 의존성 주입을 위해 생성자를 만들 때 의존 객체들을 한 번에 주입받는 생성자를 만들어낼 수 있다.

 

단, @AllArgsConstructor로 만들어낸 생성자는 바뀐 순서대로 생성자를 만든다, 예를 들어

String title;

String writer;

순서가 이렇게 되어있는데, 실수로 필드 순서를 바꿔서 생성자를 만들어 버리면, 바뀐 순서로 생성자가 만들어진다.

 

필드 순서 변경 시 데이터 매핑 오류 위험이 있어서 대참사가 발생할 수 있다. 

 

 

  • @RequiredArgsConstructor

꼭 필요한(Required) 필드만 골라서 생성자의 매개변수로 만들어주는 어노테이션

롬복은 final이 붙은 필드와 @NonNull이 붙은 필드 이 두개를 필수 필드로 인식한다.

 

final 키워드와 @RequiredArgsConstructor는 찰떡 궁합!

 

 

그래서 보통 Controller나 Service처럼 다른 객체를 주입받아 써야 하는 클래스에서는 @RequiredArgsConstructor를 주로 사용하고, DTO나 Entity처럼 모든 데이터를 담아야 하는 곳에서는 @ NoArgsConstructor,  @AllArgsConstructor, @Builder를 많이 사용한다.

 

 

  • @Slf4j

클래스에 로그를 남기기 위한 Logger 객체를 자동으로 생성해주는 어노테이션

 

@Slf4j
public class UserService {
    public void logMessage() {
        log.info("This is a log message");
    }
}

 

 

 

 

 

 


 

 

 

"@RestController 어노테이션"

 

 

 

 

  • @Controller + @ResponseBody
  • @Controller(지배인 스티커)
    • Controller 클래스가 클라이언트에게 요청을 받아서 어디로 보낼지 결정하는 역할을 한다.
  • @ReponseBody(데이터 전송 스티커)
    • 화면(HTML)을 보여주지 않고, 그냥 데이터(내용물)만 보내주는 역할

 

@RestController 어노테이션 안으로 들어가보면,

@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Controller
@ResponseBody
public @interface RestController {

 

이렇게 메타 어노테이션으로 되어있고, @Controller와 @ResponseBody도 같이 포함되어 있는 것을 확인 할 수 있다.

 

@RestController는 HttpMessageConverter를 자동으로 활성화 해주는데, 메서드가 객체(DTO)를 반환하면 ViewResolver대신 HttpMessageConverter가 개입하여 JSON으로 변환해주고, HTTP ResponseBody에 데이터를 집어넣어준다.

 

대표적인 컨버터가 Jackson 라이브러리

 

 

 


@RequestBody와 찰떡 궁합

 

 

 

 

  • @RequestBody: HTTP Request Body의 JSON 텍스트를 자바 객체로 변환
  • @RestController: 반환되는 자바 객체를 HTTP Response Body의 JSON 텍스트로 변환

 

==> 개발자는 비즈니스 로직에만 집중할 수 있다!

 

 

 

 


@Controller와 분리해놓은 이유

 

 

Stateless(무상태성)

 

서버는 상태를 들고 있기보다, 클라이언트가 요청한 자원(Resource)에 대한 데이터를 그대로 응답하는데 집중

 

 

 

 

"Entity"

 

 

Entity는 데이터베이스의 테이블과 1:1로 대응되는 Java 클래스이다.

 

데이터베이스 테이블의 구조를 Java 클래스로 표현,

테이블의 행(row)를 객체(object)로 매핑,

ORM의 핵심

 

 

 

  • Entity는 JAP(DB)에 데이터를 저장할 때 사용하는 객체여서 Entity는 거의 DB 원본과 유사하다고 볼 수 있고, 이 Entity를 클라이언트에게 직접적으로 전달 할 수 없으니까 DTO라는 데이터 전달 객체를 만들어서 보여준다.
  • "엔티티는 DB라는 안전한 금고 안에 있는 "원형"이고, DTO는 그 금고에서 필요한 것만 꺼내서 예쁘게 포장해 클라이언트에게 전달하는 "선물 상자"이다!

 

 

 

 


Entity 클래스의 기본 구조

@Getter
@Entity
@Table(name = "users")
@NoArgsConstructor(access = AccessLevel.PROTECTED)
public class User {

		@Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    @Column(length = 50, nullable = false)
    private String name;
    @Column(unique = true, nullable = false)
    private String email;
    private String address;
}

 

  • @Entity >> 이 클래스가 JPA 엔티티임을 선언
  • @Table >> 엔티티와 매핑할 테이블 정보를 지정
  • @Id >> 기본 키 (Primary Key) 매핑
  • @GeneratedValue : Pk(기본키) 자동 생성 전략을 지정,
  • @GeneratedValue(strategy = GenerationType.IDENTITY) >> 이렇게 설정을 해놓으면 DB에서 Id(고유키)값을 1,2,3,4,5,6,7.... 이런식의 순서대로 자동 생성해준다.
  • @Column >> 필드와 컬럼 매핑 정보 지정
    • ex) @Column(unique = true, nullable = false)
    • unique = true >> 중복 금지(유일성 보장) ex) 너랑 똑같은 녀석은 이 동네에 너 하나 뿐이어야해
    • nullable = false >> null값을 허용하지 않겠다.

 

 

Entity의 생명 주기

 

엔티티의 생명주기란 엔티티 객체가 생성되어 소멸하기 까지 거치는 여러 상태의 변화 과정을 의미합니다.

 

비영속 : DB에 한 번도 갔다오지 않은 상태

영속 : DB에 갔다 온 상태

 

 

 


@Transactional의 기본

 

여러 작업을 하나의 단위로 묶어서 모두 성공하거나, 하나라도 실패하게 되면, 모두 실패하는 것

이 특성을 "원자성"이라고 한다.

 

 

영속성 컨텍스트가 동작하려면 한 가지 전제 조건이 있는데, 바로 트랜잭션 경계 안이어야한다는 것,

"트랜잭션 내에서 데이터베이스를 한 번이라도 갔다온 엔티티를 관리"

 

 

 

 

@Transactional의 속성

 

 

1. readOnly = true >> 설정 시, 읽기 전용으로 사용하여 성능을 최적화한다.

2. propagation >> 트랜잭션 전파 규칙을 정의(e.g., REQUIRED, REQUIRES_NEW)

3. isolation >> 트랜잭션의 격리 수준을 설정하여 동시성 문제를 제어한다.

4. rollbackFor >> 특정 예외가 발생했을 때 강제로 롤백하도록 저장한다.

 

 

 

 


JpaRepository CRUD

 

 

 

  • Create : 데이터 새로 읽기 >> save(entity)
  • Read : 데이터 읽기 >> findById, findAll 등등
  • Update : 값 바꾸기 >> (트랜잭션 안에서) 엔티티의 필드만 변경 → 커밋 시 자동 UPDATE (더티체킹)
  • Delete: 삭제 >> delete(entity), deleteById(id), deleteAll( )

이러한 메서드들을 "쿼리메서드"라고 한다.

 

 

 

 


JPA DDL 설정

 

application.properties >> 프로젝트 설정 정보 파일

 

이 파일은 애플리케이션의 동작을 제어하기 위한 다양한 설정 값들을 key-value 형태로 저장하는데 사용됨

 

쉽게 말해, 애플리케이션의 중요한 설정들을 한 곳에 모아두는 설정 정보 창고라고 생각할 수 있음, 환경 변수라고도 함

 

 

 


 

DDL 자동 생성과 hibervate dia

spring.datasource.url=jdbc:mysql://localhost:3306/test
spring.datasource.username=root
spring.datasource.password=12345678
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.MySQLDialect
spring.jpa.hibernate.ddl-auto=create
spring.jpa.show-sql=true
spring.jpa.properties.hibernate.format_sql=true

 

spring.jpa.hibernate.ddl 옵션

 

옵션 설명 사용시기
create 기존 테이블 삭제 후 재생성 개발 초기
create-drop create + 애플리케이션 종료 시 삭제 테스트
update 변경분만 반영 (컬럼 추가만 가능) 개발 중
validate 엔티티와 테이블 매핑 정보만 확인 운영
none DDL 자동 생성 사용 안함 운영