2023-12-01
오늘은 JPA에 대해 열심히 공부했다.
아래는 공부한 내용이다.
자바 객체를 테이블에 매핑할 수 있는 ORM(객체 관계 매핑)
@Entity 어노테이션을 통해 클래스를 엔티티로 선언.
엔티티는 DB 테이블의 row에 해당하는 객체
JPQL은 SQL과 유사하지만, 엔티티를 대상으로 하는 쿼리 언어.
JPA는 엔티티 클래스에 기반하여 DB 스키마를 자동으로 생성할 수 있음.
JPA를 사용하면, 데이터베이스 코드를 변경하지 않고도 다양한 DB 시스템을 사용할 수 있음.
JPA는 4단계로 나눌 수 있다.
1. 엔티티 클래스 정의
2. Repository Interface 생성: CRUD 연산 자동 정의, 도구 제공
3. Service Layer 구현: 데이터베이스와의 구체적인 상호작용 정의
4. Controller Layer : 요청을 처리
@Autowired - Spring에서 자동으로 의존성 주입하게 처리하는 어노테이션
-
의존성 주입에 대한 이해 (이해하는데 꽤 오래걸렸다, 어려운 개념이다)
각 계층은 자신들의 역할에만 집중하며, 다른 계층의 구현에는 신경 쓰지 않는다.
각 계층은 서로의 의존성을 주입해서, 마치 하나의 클래스를 사용하는 것처럼 모든 클래스의 인스턴스 함수들에 접근할 수 있다.
Controller는 Service의 의존성을 주입 받아서 Service의 모든 함수에 접근할 수 있고, Service는 JPARepository의 의존성을 주입 받아서 Repository의 모든 함수에 접근할 수 있다.
의존성 주입은 여러가지 방법이 있고, @Autowired나 생성자 주입을 사용할 수도 있다.
-
의존성 주입에서 생성자를 계속 @Autowired와 함께 선언하면서 의존성을 주입하는데, 결국에 엔드포인트에서 최종 클래스의 객체가 선언되는 부분이 없어서 생성자는 실행되지 않는다는게 내 생각이었다. 하지만 이것은 Plain Java 에서의 생각이었고, Spring의 의존성 주입 시스템은 객체 생성 시도가 없더라도 컴포넌트 스캔을 통해 필요한 의존성이 자동으로 주입된다.
중요 키워드 -
Interface는 메소드의 시그니처(선언)만을 정의할 수 있는 타입으로 일종의 메소드 '계약'과 같다.
Class는 행위를 포함하는 구체적인 구현 타입으로, implements를 받고 선언된 모든 추상메소드를 구현한다.
@Override 어노테이션은 상위 클래스나 인터페이스의 메소드를 재정의함을 명시적으로 알린다.
중간 평가
전반적으로 정리하신 내용은 JPA, 의존성 주입, 스프링 프레임워크의 기본적인 개념들을 잘 이해하고 계신 것 같습니다. 몇 가지 추가적인 설명과 정확한 표현을 제공해드리겠습니다:
### ORM (객체 관계 매핑)
- 맞습니다, ORM은 데이터베이스 테이블과 자바 객체 간의 매핑을 관리해주는 기술입니다. `@Entity` 어노테이션은 클래스를 엔티티로 선언하여 클래스의 인스턴스가 데이터베이스 테이블의 행(row)에 대응하게 합니다.
### JPQL (Java Persistence Query Language)
- JPQL은 엔티티 객체를 대상으로 하는 쿼리 언어입니다. SQL과 유사하지만, 데이터베이스 테이블 대신 엔티티 객체에 대해 작동합니다.
### JPA의 데이터베이스 독립성
- JPA를 사용하면 데이터베이스 코드를 변경하지 않고도 다양한 DB 시스템을 사용할 수 있다는 점은 맞습니다. 이는 JPA가 데이터베이스 사이의 추상화 레이어를 제공하기 때문입니다.
### JPA의 구성 요소
- 엔티티 클래스 정의, 리포지토리 인터페이스, 서비스 레이어, 컨트롤러 레이어는 JPA를 사용하는 애플리케이션의 주요 구성 요소입니다. 특히, 리포지토리 인터페이스는 CRUD 연산을 추상화하고, 서비스 레이어는 비즈니스 로직을 처리합니다.
### 의존성 주입
- 의존성 주입은 클래스가 자신의 의존성(다른 클래스에 대한 의존)을 외부에서 주입받는 패턴입니다. `@Autowired` 어노테이션은 스프링이 자동으로 의존성을 주입하도록 지시합니다. 생성자 주입은 의존성 주입의 한 방법으로, 클래스의 생성자를 통해 의존성을 주입받습니다.
### 의존성 주입과 스프링 컨테이너
- 스프링 프레임워크는 자체적인 컨테이너를 사용하여 의존성 주입을 관리합니다. 이 컨테이너는 애플리케이션 구동 시 필요한 객체들을 생성하고, 각 객체 간의 의존성을 자동으로 주입합니다.
### 생성자와 의존성 주입
- 생성자에 `@Autowired`를 사용할 때, 스프링 컨테이너는 해당 클래스의 객체를 생성하고, 필요한 의존성을 주입합니다. 이는 일반 Java 어플리케이션에서 수동으로 객체를 생성하고 의존성을 설정하는 방식과 차이가 있습니다.
정리하신 내용은 스프링 프레임워크와 JPA의 핵심 개념을 잘 포괄하고 있으며, 이를 바탕으로 스프링 기반의 애플리케이션 개발에 필요한 기본적인 지식을 갖추신 것 같습니다. 추가적인 심화 학습을 통해 더욱 능숙한 개발자가 되실 수 있을 것입니다.
결론
- Spring Framework에서 Web Application의 구축 절차는
- Entity Class 정의 - 각 raw를 나타내는 모델
- Repository Interface 정의 - DB CRUD의 기본 메소드를 extends
- Service Layer 구현 - 비즈니스 로직 구현
- Controller Layer 구현 - 실질적 매핑, 요청 처리
오늘은 프로젝트 X의 스프링 구현 단계에서 DB TEST 오류가 난 부분을 고쳤다.
원인은 Hibernate와 JPA간의 버전 불일치, 컬럼 타입과 변수 타입 불일치 등 여러 요소가 존재했다. 여러 요소가 복합적인 오류를 만들어내고 있었기에 버그를 잡기 쉽지 않았다.
starter pack에서 이미 JPA와 관련된 기본 의존성을 버전에 맞게 세팅해주고, 이것이 Spring Boot를 사용하는 의의인데. 실수로 밑에서 hibernate에 대한 버전을 따로 명시하고 있었다. 그래서 starter pack과 명시된 버전 사이에서의 호환 문제가 일어났고. 이것이 원인이었다.
- GPT4FREE에 대한 자료도 조사해서 블로그에 올렸다.
오늘의 백준
11021
쉬운 문제였지만, 시간 관리를 해야하는 입출력 문제로 특이했다.
최종 평가
최고급 평가사 일론머스크의 평가
-------------------------------
[평가 대상]
2023-12-01일자 스터디 노트
[평가 요약]
오늘의 학습은 JPA(Java Persistence API)에 대한 집중적인 이해와 스프링 프레임워크의 의존성 주입 개념에 대한 깊은 탐구에 초점을 맞췄습니다. 주요 내용은 다음과 같습니다:
1. **JPA 학습**: JPA의 핵심 개념 및 ORM(객체 관계 매핑), 엔티티 클래스, JPQL, JPA의 구성 요소 등에 대한 이해를 높였습니다.
2. **의존성 주입 개념 이해**: 스프링 프레임워크 내에서의 의존성 주입 방법과 그 중요성에 대한 이해를 통해 객체 지향 프로그래밍의 이점을 실현하였습니다.
3. **실습 및 블로그 포스팅**: 학습한 내용을 바탕으로 문제 해결 및 블로그 포스팅을 통해 지식을 체계화하고 공유하였습니다.
4. **백준 문제 해결**: 기본적인 입출력 문제를 해결하며 프로그래밍 기초를 강화하였습니다.
[개선 및 보완점]
- **JPA 심화 학습**: JPA의 세부적인 기능 및 고급 기법에 대한 추가 학습을 통해 더욱 효율적이고 강력한 데이터 처리 기법을 습득할 필요가 있습니다.
- **프로젝트 연계 학습**: 학습한 내용을 프로젝트에 적용하여 실제 문제 해결에 활용하는 것이 중요합니다.
[종합 평가]
오늘의 학습은 JPA 및 스프링 프레임워크의 핵심 개념을 효과적으로 이해하고, 의존성 주입을 통한 객체 지향 프로그래밍의 이점을 실현하는 데 중점을 두었습니다. 이론적 지식과 실습을 병행하는 접근 방식은 매우 효과적입니다. 백준 문제 해결을 통해 프로그래밍 능력을 강화하는 과정도 인상적입니다.
[종합 점수]
92/100
'일일 스터디노트' 카테고리의 다른 글
231203: Spring on AWS, mvn, 개발 배포 환경 분리 (0) | 2023.12.04 |
---|---|
231202: POST API 구현, CORS 정책 (0) | 2023.12.03 |
231129: Now you are Santa. (0) | 2023.11.30 |
231128: AWS EC2에 MySQL 세팅 (0) | 2023.11.28 |
231127: 감기, 산타 부정단어 로직 (0) | 2023.11.27 |