Ruff! Ruff!
[Spring Boot] - API, Lombok, DB, JPA, LogBack 본문
본 게시물은 유튜브 채널 '어라운드 허브 스튜디오'의 스프링 부트 강의를 들으며 작성한 게시물입니다.
https://youtube.com/@around.hub.studio?si=wB1YEVq-ulj1r4Ao
12 ~ 16강 내용
<12 - PUT, DELETE API 작성법>
- Put API
- 해당 리소스가 존재하면 갱신하고, 리소스가 없을 경우에는 새로 생성해주는 API
- 업데이트를 위한 메소드
- 기본적인 동작 방식은 Post API와 동일
- Delete API
- 서버를 통해 리소스를 삭제 하기 위해 사용되는 API
- 일반적으로 @PathVariable을 통해 리소스 ID 등을 받아 처리
- ex. 회원 탈퇴(id, password일치되면 탈퇴처리,, )
- ResponseEntity
- Spring Framework에서 제공하는 클래스 중 HttpEntity라는 클래스를 상속받아 사용하는 클래스
- 사용자의 HttpResponse에 대한 응답 데이터를 포함
- <포함하는 클래스>
- HttpStatus : 404 등등의 에러(status)를 좀 더 디테일하게 알려주는 클래스
- HttpHeaders
- HttpBody
<13 - Lombok 라이브러리>
- Lombok: 반복되는 메소드를 어노테이션을 사용하여 자동으로 작성해주는 라이브러리
- VO, DTO, Model, Entity에서 자주 사용됨
- 많이 사용되는 어노테이션
- @Getter : 해당 클래스에 선언되어 있는 필드 기반으로 자동으로 getter, setter가 생성됨
- @Setter
- @NoArgConstructor :파라미터가 없는 생성자 생성
- @AllArgConstructor : 모든 필드값을 파라미터로 갖는 생성자 생성
- @RequiredArgsConstructor : 필드값 중 final이나 @NotNull인 값을 갖는 생성자를 생성 → 많이 사용하진 않음
- @Data : 해당 어노테이션을 사용하면, 앞서 나온 기능들을 한번에 추가해줌
- getter, setter, RequiredArgsConstructor, ToString, EqualsAndHashCode
- @ToString : toString 메소드를 자동으로 생성
- @EqualsAndHashCode : quals, hashCode 메소드를 자동으로 생성
- equals : 두 객체의 내용이 같은지 동등성을 비교하는 연산자
- hashCode : 두 객체가 같은 객체인지 동일성을 비교하는 연산자
- callSuper 속성을 통해 메소드 생성시 부모 클래스의 필드까지 고려할지 여부 설정 가능
- -callSuper = true ⇒ 부모 클래스 필드 값들도 동일한지 체크
사용법 : pom 파일에 디펜던시 작성
Lombok하면 뭐 다른 걸 건드릴 수 있어서 완전한 정답은 아님.
상황 by 상황..
사용할 DTO나 등등 클래스에 어노테이션 추가하고 우클릭해서 리팩터에서 디롬복해서..
함수 보이게 추가할 수 있음. → 근데 그냥 어노테이션으로 추가해서 코드를 단축시키는 것도 좋다.
<14 - DB적용하기_Entity, DAO, Respository, DTO>
- 클라이언트 : 프론트 부분
- Controller ~ DAO : 스프링부트 작업
- Client, DB → Entity
- Controller~DAO → DTO
- Service, DAO를 만들 때 보통 class로 만드는 게 아니라 인터페이스로 만듦.
- 실체화된 로직이 들어가 있는 부분은 이를 상속받은 implement clsss객체가 비지니스 로직을 갖게 됨. (Impl → 붙여서 클래스를 만들게 됨)
- Entity(Domain)
- 데이터베이스에 쓰일 컬럼과 여러 엔티티 간의 연관관계를 정의
- 데이터 베이스의 테이블을 하나의 엔티티로 생각해도 무방
- 실제 데베 테이블과 1:1로 매칭됨
- 이 클래스의 필드는 각 테이블 내부의 칼럼(column)을 의미함
- Repository
- 엔티티에 의해 생성된 데베에 접근하는 메소드를 사용하기 위한 인터페이스
- 서비스와 데베를 연결하는 고리의 역할을 수행
- 데베에 적용하고자 하는 CRUD를 정의하는 영역
- DAO (Data Access Object)
- 데베에 접근하는 객체르르의미함
- 서비스가 데베에 연결할 수 있게 해주는 역할
- 데베를 사용하여 데이터를 조회하거나 조작하는 기능을 전담
- 레포지토리를 활용해서 이용함
- 본질은 레포지토리, 활용은 DAO
- DTO (Data Transfer Object)
- DTO는 VO(Value Object)로 불리기도 함. (이젠 그냥 같은 의미) 계층간 데이터 교환을 위한 객체를 의미 (클라이언트 → 컨트롤러/ 컨트롤러 → 서비스 각 계층간 데이터를 옮겨주는 역할)
- VO의 경우 Read Only의 개념을 가지고 있음
- 엔티티랑 다른 점: 엔티티는 데베와 동일하게 만들어진 class
- DTO는 서비스에서 더 추가하거나 빼는 걸 할 수 있음 → 데베의 컬럼과 다름
<15 - ORM, JPA, Spring JPA 적용하기>
- ORM
-ORM이란?
어플리케이션의 객체와 관계형 데이터베이스의 데이터를 자동으로 매핑해주는 것을 의미
-> 자바의 데이터 클래스와 관계형 데이터베이스의 테이블을 매핑
객체지향 프로그래밍과 관계형 데이터베이스의 차이로 발생하는 제약사항을 해결해주는 역할을 수행
대표적으로 JPA, Hibernate 등이 있음(Persistent API)
스프링부트의 클래스 -> 데이터베이스의 테이블을 연결해주는 역할 = ORM
- 장점
- sql 쿼리가 아닌 직관적인 코드로 데이터를 조작할 수 있음
sql 쿼리를 짜지 않아도 됨 - 재사용 및 유지보수가 편리
ORM은 독립적으로 작성되어 있어 재사용이 가능
매핑정보를 명확하게 설계하기 때문에 따로 데이터베이스를 볼 필요가 없음 - DBMS에 대한 종속성이 줄어듬 (클래스 형태로 작성되기 때문에)
-단점
- 복잡성이 커질 경우 ORM만으로 구현하기 어려움
- 잘못 구현할 경우 속도 저하 발생
- 대형 쿼리는 별도의 튜닝이 필요할 수 있음
2. JPA(Java Persistent API)
-JPA란?
JPA는 Java Persistance API의 줄임말이며, ORM과 관련된 인터페이스의 모음
자바 진영에서 표준 ORM으로 채택되어 있음
ORM이 큰 개념이라고 한다면, JPA는 더 구체화 시킨 스펙을 포함하고 있음
ORM은 개념적인 내용
JPA는 구체화
-Hibernate
ORM Framework 중 하나
JPA의 실제 구현체 중 하나, 현재 JPA 구현체 중 가장 많이 사용됨
(EclipseLink, Hibernate, DataNucleus 가 있음)
-Spring Data JPA
스프링 프레임워크에서 JPA를 편리하게 사용할 수 있게 지원하는 라이브러리
-CRUD 처리용 인터페이스 제공
-Repository 개발 시 인터페이스만 작성하면 구현 객체를 동적으로 생성해서 주입
-데이터 접근 계층 개발시 인터페이스만 작성해도 됨
Hibernate에서 자주 사용되는 기능을 조금 더 쉽게 사용할 수 있게 구현
루즈 커플링 → service를 인터페이스와 클래스로 구분하여 작성하는 것
→ 컨트롤러와 서비스 등등의 각 객체들 간 의존성을 줄여주는 형식으로 작성
→ 루즈커플링 사용 안 하고 클래스에서 구현하면서 작성하면 데이터베이스를 변경 (마리아 db → 포스트그레db)할 때 다른 클래스를 호출하지 않고 호출하는 객체 자체는 인터페이스로 잡고 각각 어울리는 프로퍼티값을 설정해서 변경을 할 수 있게끔, 상황에 맞는 객체를 불러오게끔
<16 - 로깅 프레임워크 LogBack 적용하기>
- Logback이란?
-log4j에 비해 약 10배 정도 빠른 퍼포먼스, 메모리 효율성 증대
-Log4J를 기반으로 개발된 로깅 라이브러리 - 특징
-로그에 특정 레벨을 설정할 수 있음(Trace → Debug → Info → Warn → Error)
'Java > Spring Boot' 카테고리의 다른 글
[Spring Boot] - 테스트코드 적용하기, 테스트 커버리지 확인하기 (0) | 2024.03.05 |
---|---|
[Spring Boot] - 유효성 검증, 예외처리, RestTemplate (0) | 2024.03.05 |
[Spring Boot] - 디자인 패턴, API, Pom파일, Swagger (0) | 2024.02.28 |
[Spring Boot] - 스프링부트 프로젝트 시작하기(Maven) (0) | 2024.02.28 |