자바 스프링 개인 과제를 하면서 알게 된 것들이 많은데(사실 전부 다 몰랐던 것들 뿐이라 머리가 깨진드아아아아아)
이를 팀 과제에서 정리한 것들에 대한 내용을 이 글에서 적어본다...
참고 링크 : https://velog.io/@jwkim/JPA-JPA%EB%9E%80-%EB%AC%B4%EC%97%87%EC%9D%B8%EA%B0%80
JPA 가 제공하는 API 를 사용시 객체를 DB에 저장하고 관리할 때 직접 SQL을 작성하지 않아도 된다.
개발자 대신 SQL을 생성 및 DB 에 전달하고 객체를 자동으 Mapping 까지 해준다.
↓↓↓위에서 얘기한 ORM 과 Hibernate 에 관해서 ↓↓↓
Object-Relational Mapping
객체와 관계형 DB 를 매핑한다는 의미로, 객체를 자바 컬렉션에 저장이 가능하고 이에 대해서ORM 프레임워크
가 적절한SQL
을 생성해서DB
에 객체를 저장해준다.
자바 진영의 다양한
ORM 프레임워크
중 가장 많이 사용되는 프레임워크
Hibernate
기반으로 만들어진ORM
기술 표준을JPA
라고 한다.
즉,JPA
라는ORM
기술 표준을 구현한 것이Hibernate
이기 때문에JPA
를 사용하려면 이 프레임워크를 사용하면 된다.
4조의 가수
이신 이진
님이 정리하신 내용
링크는 여기 : https://leejincha.tistory.com/
프레젠테이션 레이어, 웹 요청과 응답을 처리한다.
사용자가 화면(View)단에서 입력이나 어떤 이벤트를 했을 경우, 그 이벤트에 맞는 화면(View)이나 비지니스 로직(Model)을 실행할 수 있도록 업데이트 해주는 역할을 한다.
즉, Model과 View를 연결해주는 다리 역할이라고 할 수 있다.
서비스 레이어, 내부에서 자바 로직을 처리함
Controller
의 요청을 받아 알맞은 정보를 가공Controller
에게 재전달한다.
Repository
에서 얻어온 정보를 바탕으로 자바 문법을 이용하여 가공 후 다시Controller
에게 정보를 보내는 곳이다.
퍼시스턴스 레이어, DB나 파일같은 외부 I/O 작업을 처리함
Repository
는 직역해도저장소
로 데이터베이스와 깊은 연관이 있음을 알 수 있다.
데이터단에 직접 매칭되는Entity
라는 것이 있는데, 이를 통해 데이터 테이블이 생성이 되면, 받아온 정보를 데이터베이스(ex. MySQL, mariaDB)에 저장하고 조회하는 기능을 수행한다.
Entity
에 의해 생성된 DB
에 접근하는 메서드를 사용하기위한 interface
이다.JPA
를 상속받음으로써 기본적인 CRUD
의 동작(함수 사용)이 가능해진다.restAPI의 put 과 patch 는 어떤 차이점이 있을까요? 어떤 경우에 사용하면 좋을까요?
자원를 변경할 때에 사용하는 방식이다. CRUD에서 U. Update에 해당하며, DB에서도 Update에 해당한다.
참고로 PUT은 자원을 모두 대체(replace)하는 메소드이다.
요청한 URL 아래에 해당 자원이 존재하지 않으면 POST와 마찬가지로 새로운 자원으로써 저장한다.
만약 요청한 URL 아래에 해당 자원이 존재하면 기존에 존재하던 자원을 새롭게 요청으로 들어간 정보로 자원 전체를 대체한다.
만약 PUT을 사용하여 일부만 변경하고자 하여 자원의 전체 상태를 완전하지 못한 상태로 전송한다면 일부가 null값으로 변경될 수 있다.
PATCH 역시 데이터를 변경할 때 사용한다.
하지만 PUT과 PATCH는 서로 대체제 관계가 아니며, 다른 정의와 규약을 가지고 있다.
PATCH 요청은 자원에 대한 부분적인 수정을 적용하기 위해 사용되는데, 그렇기에 필요한 정보에 대해서만 요청할 수 있다.
스프링의 특징에는 제어의 역전(IoC / Invention Of Control)이 있다.
제어의 역전이란, 간단히 말해서 객체의 생성 및 제어권을 사용자가 아닌 스프링에게 맡기는 것이다.
객체에 IoC가 적용된 경우에는 이러한 객체의 생성과 사용자의 제어권을 스프링에게 넘기게 되며 스프링의 DI(Dependency Injection) Container에 의하여 관리 당하는 자바 객체를 사용자는 사용하게 된다.
이 객체를 '빈(bean)'이라 한다.
4조 교수님 지성
님이 정리하신 내용
Representational State Transfer의 약자자원의 이름(자원의 표현)으로 구분하여 자원의 상태(정보)를 주고 받는 모든 것을 의미
- HTTP URL을 통해 자원(Resource)를 명시하고
- HTTP Method(POST, GET, PUT, DELETE)를 통해
- 해당 자원에 대한 'CRUD Operation'을 적용하는 것을 의미한다.
모든 자원에 고유한 ID가 존재하고, 이 자원은 서버에 존재한다.
자원을 구별하는 ID는 '/groups/:group_id'와 같은 HTTP URL이다.
Client는 URL을 이용해서 자원을 지정하고 해당 자원의 상태(정보)에 대한 조작을 서버에 요청한다.
HTTP 프로토콜의 Method를 사용한다.: HTTP 프로토콜은 GET, POST, PUT, DELETE와 같은 메서드를 제공한다.
클라이언트가 자원의 상태(정보)에 대한 조작을 요청하면 서버는 이에 적절한 응답(Representation)을 보낸다.
REST에서 하나의 자원은 JSON, XML, TEXT, RSS등 여러 형태의 Representation으로 나타내어 질 수 있다.
JSON 혹은 XML을 통해 데이터를 주고 받는 것이 일반적이다.
- RESTful은 일반적으로 REST라는 아키텍처를 구현하는 웹 서비스를 나타내기 위해 사용되는 용어이다.즉, 'REST API'를 제공하는 웹 서비스를 'RESTful'하다고 할 수 있다.
- RESTful은 REST를 REST답게 쓰기 위한 방법으로, 누군가가 공식적으로 발표한 것은 아니다.즉, REST 원리를 따르는 시스템은 RESTful이란 용어로 지칭된다.
4조 조교님이신 소영
님이 정리하신 내용
링크는 여기 : https://littlezero48.tistory.com/
사용하는 방법을 보면 라이브러리 == dependency ? 라는 의문이 생긴다.
라이브러리를 사용하는데 왜 dependency를 추가하는 것이라고 할까
클래스 A가 다른 클래스 또는 인터페이스 B를 사용할 때 A가 B에 의존하는 관계가 된다.
B가 없으면 작동할 수 없는 A를 dependant라고 하며, 의존의 대상이 되는 B를 dependency라고 한다.
또한 의존대상 B가 변하면 그것이 A에 영향을 미친다.
코드를 짤 때 라이브러러의 기능을 작성한 클래스가 사용하게 되면 라이브러리에 의존하게 되므로 라이브러리는 dependency가 되며, 작성한 클래스는 dependant가 된다.
그래서 dependency와 라이브러리가 같은 것 이라고 할 수 없지만 라이브러리를 사용하는 것이 dependency 즉, 의존성을 늘리게 되는 행동이기 때문에 라이브러리를 사용하는 것을 dependency를 추가한다고 표현하는 것이다.
참고링크
https://goddaehee.tistory.com/167
https://tecoble.techcourse.co.kr/post/2021-05-25-transactional/
4조 조교님이신 미경
님이 정리하신 내용
링크는 여기 : https://velog.io/@beautifulseoul
우리말로
거래
라는 의미를 가지고 있다.
DB 를 다룰 때 트랜잭션을 적용하면 데이터 추가,갱신,삭제 등(CRUD)의 작업이 가능하다.
트랜잭션을 사용했을 때 가장 큰 장점으로 하나의 단위로 처리하기 때문에 작업도중 오류가 발생하면
모든 작업을 원상태로 돌리는것이(롤백) 가능하다. 최종적으로 완료시 DB에 반영한다.
스프링에서는 간단하게 어노테이션 방식으로 @Transactional을 메소드, 클래스, 인터페이스 위에 추가하여 사용하는 방식이 일반적이다.
이 방식을 선언적 트랜잭션이라 부르며, 적용된 범위에서는 트랜잭션 기능이 포함된 프록시 객체가 생성되어 자동으로 commit 혹은 rollback을 진행해준다.
위에서 너무 정리를 잘 해 주셔서 내가 적은건 마지막에 살짝 위치..
Data Access Object 의 약자로, 실제로 DB 에 접근하는 객체이다.
즉, 프로젝트 서비스 모델과 실제 데이터베이스를 연결하는 역할을 한다.
이를 우리가 사용하는 JPA 에서 예로 들면 DB에 데이털르 CRUD 하는 Repository 객체들이 DAO 라고 볼 수 있다.
서비스 단에서 값을 날리면 그 값이 바로 DAO 라고 한다.
그렇다면... Repository 가 DAO 를 대체하는 듯 한데 이는 어떻게 된걸까
DB 에 직접 쿼리를 날려 CRUD 하는 것은 동일하나, 개념적인 측면에서 차이가 있다.
Data Transfer Object 약자로, 계층 간 데이터 교환 역할을 한다.
DB 에서 꺼낸 데이터를 저장하는 Entity를 가지고 만드는 일종의 Wrapper(포장) 라고 볼 수 있다.
엔티티를 직접 클라이언트단 과 직접 마주하는 계층에 전달하는 대신 DTO 를 통해서 데이터를 교환한다.
DB 에서 꺼낸 값을 DTO 에서 줄 뿐이기 때문에 순수한 데이터 객체이며 Setter 또한 만들 필요 없이 생성자에서 값을 할당한다.
다만 이것도 Builder 패턴을 통해 값을 할당이 가능하기 때문에 그러는것이 좋다.
Dto와 다르게 Read-Only 속성을 가진다.
자바에서 단순히 값 타입을 표현하기 위해 불변 클래스를 만들어 사용한다.
VO의 핵심 역할은 equals()와 hashcode() 를 오버라이딩 하는 것이다.
참고 링크 : https://m.blog.naver.com/ljc8808/220462395989
VO(Value Object) 도 DTO 와 동일한 개념이나, DTO 는 데이터를 계층간 교환하는 것에 목적이 있지만 VO는 읽기만 가능한
read-only 속성을 가진 객체로서 데이터 그 자체에 의미를 두고 있다.
DTO는 메소드 호출 횟수를 줄이기 위해 데이터를 담고 있는 녀석으로, VO는 값이 같으면 동일 오브젝트라고 볼 수 있는 것으로 표현하고 있다.
DTO a = new DTO(1);
DTO b = new DTO(1);
이라고 했을 때, a != b 이지만,
VO a = VO(1);
VO b = VO(1);
이라고 했을 때는 a == b 라고 정의하는 형태이다.