3주차 마무리

Cloudman·2022년 11월 30일
0

항해99

목록 보기
10/10

자바 스프링 개인 과제를 하면서 알게 된 것들이 많은데(사실 전부 다 몰랐던 것들 뿐이라 머리가 깨진드아아아아아)

이를 팀 과제에서 정리한 것들에 대한 내용을 이 글에서 적어본다...




JPA 개념 재정리

참고 링크 : 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 까지 해준다.

  • Java 진영에서 ORM(Object-Relational Mapping) 기술 표준으로 사용하는 인터페이스 모음
  • 자바 어플리케이션에서 관계형 데이터베이스를 사용하는 방식을 정의한 인터페이스
  • 인터페이스 이기 때문에 Hibernate, OpenJPA 등이 JPA를 구현함
  • 참고로, JPA는 수정 메소드를 제공하지 않는다. 하지만 당연히 수정은 필요하기 때문에 JPA는 데이터 수정시, 매핑된 객체(테이블 데이터)를 조회해서 값을 변경 후 커밋하면 DB 서버에 UPDATE 문을 전송하여 UPDATE를 실행한다.
  • 추가적으로 알아둬야 할 것은, 스프링에서 흔히 사용하는 것으로 알고있는 JPA는, JPA를 이용하는 spring-data-jpa 프레임워크이지 JPA는 아니다.

↓↓↓위에서 얘기한 ORM 과 Hibernate 에 관해서 ↓↓↓

ORM

Object-Relational Mapping
객체와 관계형 DB 를 매핑한다는 의미로, 객체를 자바 컬렉션에 저장이 가능하고 이에 대해서 ORM 프레임워크 가 적절한 SQL 을 생성해서 DB 에 객체를 저장해준다.

Hibernate

자바 진영의 다양한 ORM 프레임워크 중 가장 많이 사용되는 프레임워크
Hibernate 기반으로 만들어진 ORM 기술 표준을 JPA 라고 한다.
즉, JPA 라는 ORM 기술 표준을 구현한 것이 Hibernate 이기 때문에 JPA 를 사용하려면 이 프레임워크를 사용하면 된다.




MVC 핵심 어노테이션

Controller

4조의 가수이신 이진님이 정리하신 내용
링크는 여기 : https://leejincha.tistory.com/

프레젠테이션 레이어, 웹 요청과 응답을 처리한다.
사용자가 화면(View)단에서 입력이나 어떤 이벤트를 했을 경우, 그 이벤트에 맞는 화면(View)이나 비지니스 로직(Model)을 실행할 수 있도록 업데이트 해주는 역할을 한다. 
즉, Model과 View를 연결해주는 다리 역할이라고 할 수 있다.

  • 서버에서 기능별 URL이라는 API를 개설해 놓았고, 클라이언트는 필요한 정보를 얻기 위해 적절한 API에 요청한다.
    Controller는 이런 창구 역할을 하는 API들을 모아놓은 클래스라고 할 수 있다.
  • Front-end에서 들어오는 클라이언트 측의 요청이 가장 먼저 서버 측과 맞닿는 부분
  • Client의 요청을 받았을 때 그 요청에 대해 실제 업무를 수행하는 Service를 호출
  • 클라이언트가 보낸 데이터가 있다면 Service를 호출할 때 전달하기 쉽게 데이터의 가공
  • 모델의 업무 수행이 완료되면 그 결과를 바탕으로 화면을 구성하도록 View에 전달
  • @Controller 어노테이션을 사용하여 만들어진 컨트롤러 클래스에 라우팅(Routing)할 수 있도록 요청 URL에 대해 해당하는 메소드를 매핑해줄 수 있도록 하기 위해 @RequestMapping 어노테이션을 사용한다.

Service

서비스 레이어, 내부에서 자바 로직을 처리함
Controller의 요청을 받아 알맞은 정보를 가공 Controller에게 재전달한다.
Repository에서 얻어온 정보를 바탕으로 자바 문법을 이용하여 가공 후 다시 Controller에게 정보를 보내는 곳이다.

  • 클라이언트 즉 controller 쪽에서 바로 데이터베이스에 접근하여 정보를 얻고 가공해서 가져가는 것은 위험하다.
  • 정보를 직접 CRUD하고 가공하는 과정에서 테이블에 저장된 원본의 정보가 손상될 우려가 크기 때문이다.
  • 따라서 정보 변동의 위험이 큰 로직은 Service에서 진행한다.
  • 추가로 이때 원본의 데이터를 사용하는 것이 아니라 데이터베이스에서 추출한 정보의 복사본인 DTO를 만들어서 로직을 조작한다.

Repository

퍼시스턴스 레이어, DB나 파일같은 외부 I/O 작업을 처리함
Repository는 직역해도 저장소로 데이터베이스와 깊은 연관이 있음을 알 수 있다.
데이터단에 직접 매칭되는 Entity라는 것이 있는데, 이를 통해 데이터 테이블이 생성이 되면, 받아온 정보를 데이터베이스(ex. MySQL, mariaDB)에 저장하고 조회하는 기능을 수행한다.

  • Entity 에 의해 생성된 DB 에 접근하는 메서드를 사용하기위한 interface 이다.
  • JPA 를 상속받음으로써 기본적인 CRUD 의 동작(함수 사용)이 가능해진다.
  • JpaRepository<대상 엔티티, Entity에 접근할 객체의 Type>




Put 과 Patch

restAPI의 put 과 patch 는 어떤 차이점이 있을까요? 어떤 경우에 사용하면 좋을까요?

PUT

자원를 변경할 때에 사용하는 방식이다. CRUD에서 U. Update에 해당하며, DB에서도 Update에 해당한다.
참고로 PUT은 자원을 모두 대체(replace)하는 메소드이다.

요청한 URL 아래에 해당 자원이 존재하지 않으면 POST와 마찬가지로 새로운 자원으로써 저장한다.
만약 요청한 URL 아래에 해당 자원이 존재하면 기존에 존재하던 자원을 새롭게 요청으로 들어간 정보로 자원 전체를 대체한다.
만약 PUT을 사용하여 일부만 변경하고자 하여 자원의 전체 상태를 완전하지 못한 상태로 전송한다면 일부가 null값으로 변경될 수 있다.

PATCH

PATCH 역시 데이터를 변경할 때 사용한다.
하지만 PUT과 PATCH는 서로 대체제 관계가 아니며, 다른 정의와 규약을 가지고 있다.
PATCH 요청은 자원에 대한 부분적인 수정을 적용하기 위해 사용되는데, 그렇기에 필요한 정보에 대해서만 요청할 수 있다.




Bean

스프링의 특징에는 제어의 역전(IoC / Invention Of Control)이 있다.
제어의 역전이란, 간단히 말해서 객체의 생성 및 제어권을 사용자가 아닌 스프링에게 맡기는 것이다.
객체에 IoC가 적용된 경우에는 이러한 객체의 생성과 사용자의 제어권을 스프링에게 넘기게 되며 스프링의 DI(Dependency Injection) Container에 의하여 관리 당하는 자바 객체를 사용자는 사용하게 된다.
이 객체를 '빈(bean)'이라 한다.




RESTful 하다?

4조 교수님 지성 님이 정리하신 내용

REST의 정의

Representational State Transfer의 약자자원의 이름(자원의 표현)으로 구분하여 자원의 상태(정보)를 주고 받는 모든 것을 의미

  1. HTTP URL을 통해 자원(Resource)를 명시하고
  2. HTTP Method(POST, GET, PUT, DELETE)를 통해
  3. 해당 자원에 대한 'CRUD Operation'을 적용하는 것을 의미한다.

REST의 구성 요소

자원(Resource) HTTP URL

모든 자원에 고유한 ID가 존재하고, 이 자원은 서버에 존재한다.
자원을 구별하는 ID는 '/groups/:group_id'와 같은 HTTP URL이다.
Client는 URL을 이용해서 자원을 지정하고 해당 자원의 상태(정보)에 대한 조작을 서버에 요청한다.

행위(Verb) HTTP Method

HTTP 프로토콜의 Method를 사용한다.: HTTP 프로토콜은 GET, POST, PUT, DELETE와 같은 메서드를 제공한다.

표현(Representations) HTTP Message Pay Load

클라이언트가 자원의 상태(정보)에 대한 조작을 요청하면 서버는 이에 적절한 응답(Representation)을 보낸다.
REST에서 하나의 자원은 JSON, XML, TEXT, RSS등 여러 형태의 Representation으로 나타내어 질 수 있다.
JSON 혹은 XML을 통해 데이터를 주고 받는 것이 일반적이다.

그래서 RESTful 이란 ?

  • RESTful은 일반적으로 REST라는 아키텍처를 구현하는 웹 서비스를 나타내기 위해 사용되는 용어이다.즉, 'REST API'를 제공하는 웹 서비스를 'RESTful'하다고 할 수 있다.
  • RESTful은 REST를 REST답게 쓰기 위한 방법으로, 누군가가 공식적으로 발표한 것은 아니다.즉, REST 원리를 따르는 시스템은 RESTful이란 용어로 지칭된다.
  • RESTful 하지 못한 경우
  1. CRUD 기능을 모두 POST로만 처리하는 API
  2. REST API의 설계 규칙을 지키지 못한 경우
  • REST API 설계 규칙
  1. URL는 동사보다는 명사를, 대문자보다는 소문자를 사용해야 한다.
  2. 마지막에 슬래시(/)를 포함하지 않는다.
  3. 언더바 대신 하이폰을 사용한다.
  4. 파일확장자는 URL에 포함하지 않는다.
  5. 행위를 포함하지 않는다.




의존성이란 ?

4조 조교님이신 소영 님이 정리하신 내용
링크는 여기 : https://littlezero48.tistory.com/

사용하는 방법을 보면 라이브러리 == dependency ? 라는 의문이 생긴다.
라이브러리를 사용하는데 왜 dependency를 추가하는 것이라고 할까
클래스 A가 다른 클래스 또는 인터페이스 B를 사용할 때 A가 B에 의존하는 관계가 된다.
B가 없으면 작동할 수 없는 A를 dependant라고 하며, 의존의 대상이 되는 B를 dependency라고 한다.
또한 의존대상 B가 변하면 그것이 A에 영향을 미친다.

코드를 짤 때 라이브러러의 기능을 작성한 클래스가 사용하게 되면 라이브러리에 의존하게 되므로 라이브러리는 dependency가 되며, 작성한 클래스는 dependant가 된다.

그래서 dependency와 라이브러리가 같은 것 이라고 할 수 없지만 라이브러리를 사용하는 것이 dependency 즉, 의존성을 늘리게 되는 행동이기 때문에 라이브러리를 사용하는 것을 dependency를 추가한다고 표현하는 것이다.




Transactional

참고링크
https://goddaehee.tistory.com/167
https://tecoble.techcourse.co.kr/post/2021-05-25-transactional/

4조 조교님이신 미경 님이 정리하신 내용
링크는 여기 : https://velog.io/@beautifulseoul

우리말로 거래 라는 의미를 가지고 있다.
DB 를 다룰 때 트랜잭션을 적용하면 데이터 추가,갱신,삭제 등(CRUD)의 작업이 가능하다.
트랜잭션을 사용했을 때 가장 큰 장점으로 하나의 단위로 처리하기 때문에 작업도중 오류가 발생하면
모든 작업을 원상태로 돌리는것이(롤백) 가능하다. 최종적으로 완료시 DB에 반영한다.

4가지 성질

  • 원자성(Atomicity) : 한 트랜잭션 내에서 실행한 작업들은 하나의 단위로 처리한다. 즉, 모두 성공 또는 모두 실패.
  • 일관성(Consistency) : 트랜잭션은 일관성 있는 데이타베이스 상태를 유지한다. (data integrity 만족 등.)
  • 격리성(Isolation) : 동시에 실행되는 트랜잭션들이 서로 영향을 미치지 않도록 격리해야한다.
  • 영속성(Durability) : 트랜잭션을 성공적으로 마치면 결과가 항상 저장되어야 한다.

Transaction 처리 방법

스프링에서는 간단하게 어노테이션 방식으로 @Transactional을 메소드, 클래스, 인터페이스 위에 추가하여 사용하는 방식이 일반적이다.
이 방식을 선언적 트랜잭션이라 부르며, 적용된 범위에서는 트랜잭션 기능이 포함된 프록시 객체가 생성되어 자동으로 commit 혹은 rollback을 진행해준다.




DAO, DTO, VO

  • DAO : 이름 그대로 DB에 접근하기 위한 객체이다. 서비스와 DB를 연결하기 위한 중간 다리의 역할을 한다. Mybatis를 기준으로 예시를 작성한다.
  • DTO : 말 그대로 '데이터 전송 객체'이다. 뷰에서 컨트롤러로 넘어오는 데이터를 담거나, 컨트롤러에서 서비스로 넘기는 데이터를 담거나 할 때 사용할 수 있다. 로직을 가지지 않고, 데이터 객체에 대한 정보만 담고 있다.
  • VO : VO는 값 그 자체를 나태는 객체이다. DTO와 반대로 로직을 포함할 수 있으며, VO의 경우 특정 값 자체를 표현하기 때문에 불변성의 보장을 위해 생성자를 사용하여야 한다. 서로 다른 이름을 갖는 VO 인스턴스라도 모든 속성 값이 같다면 두 인스턴스는 같은 객체인 것이 핵심이다.

DAO

  • DAO(Data Access Object) 는 데이터베이스의 data에 접근하기 위한 객체. DataBase에 접근 하기 위한 로직 & 비지니스 로직을 분리하기 위해 사용한다.
  • DAO의 경우는 DB와 연결할 Connection 까지 설정되어 있는 경우가 많다.
  • 그래서 현재 많이 쓰이는 Mybatis 등을 사용할 경우 커넥션풀까지 제공되고 있기 때문에 DAO를 별도로 만드는 경우는 드물다.
  • DAO는 오버헤드를 줄이기 위해 사용된다. 오직 1개의 커넥션만을 이용하여 다수의 사용자들의 생성, 조회, 수정 , 삭제 등의 DB I/O역할을 모두 수행하기 때문에 애플리케이션의 안정된 운용을 보장해 준다.

DTO

  • DTO(Data Transfer Object) 는 계층 간 데이터 교환을 하기 위해 사용하는 객체로, DTO는 로직을 가지지 않는 순수한 데이터 객체(getter & setter 만 가진 클래스)이다.
  • 여기서 getter/setter 이외에 다른 로직이 필요 없는 이유를 좀 더 자세히 살펴보자면, 만약 DTO가 데이터 전달 만을 위한 객체라고 한다면 완전히 데이터 '전달' 용도로만 사용하기 때문에 getter/setter로직만이 필요하지 다른 로직이 필요하지 않은 것이다.
  • 유저가 입력한 데이터를 DB에 넣는 과정을 보면,
    • 유저가 자신의 브라우저에서 데이터를 입력하여 form에 있는 데이터를 DTO에 넣어서 전송한다.
    • 해당 DTO를 받은 서버가 DAO를 이용하여 데이터베이스로 데이터를 집어넣는다.

VO

  • VO(Value Object) 값 오브젝트로써 값을 위해 쓰인다. (VO는 값 그 자체를 나태는 객체이다.)
  • DTO와 반대로 로직을 포함할 수 있으며, VO의 경우 특정 값 자체를 표현하기 때문에 불변성의 보장을 위해 생성자를 사용하여야 한다.
  • read-Only 특징(사용하는 도중에 변경 불가능하며 오직 읽기만 가능)을 가진다.
  • DTO와 유사하지만 DTO는 setter를 가지고 있어 값이 변할 수 있다.
  • VO는 서로 다른 이름을 갖는 VO 인스턴스라도 모든 속성 값이 같다면 두 인스턴스는 같은 객체인 것이 핵심이다.
  • 반면, DTO는 서로 다른 이름을 갖는 두 DTO인스턴스가 속성 값이 같더라도 두 인스턴스는 다른 객체라는 점에서 차이가 있다.




위에서 너무 정리를 잘 해 주셔서 내가 적은건 마지막에 살짝 위치..

DAO 란

Data Access Object 의 약자로, 실제로 DB 에 접근하는 객체이다.
즉, 프로젝트 서비스 모델과 실제 데이터베이스를 연결하는 역할을 한다.
이를 우리가 사용하는 JPA 에서 예로 들면 DB에 데이털르 CRUD 하는 Repository 객체들이 DAO 라고 볼 수 있다.
서비스 단에서 값을 날리면 그 값이 바로 DAO 라고 한다.

그렇다면... Repository 가 DAO 를 대체하는 듯 한데 이는 어떻게 된걸까
DB 에 직접 쿼리를 날려 CRUD 하는 것은 동일하나, 개념적인 측면에서 차이가 있다.

DTO 란

Data Transfer Object 약자로, 계층 간 데이터 교환 역할을 한다.
DB 에서 꺼낸 데이터를 저장하는 Entity를 가지고 만드는 일종의 Wrapper(포장) 라고 볼 수 있다.
엔티티를 직접 클라이언트단 과 직접 마주하는 계층에 전달하는 대신 DTO 를 통해서 데이터를 교환한다.

DB 에서 꺼낸 값을 DTO 에서 줄 뿐이기 때문에 순수한 데이터 객체이며 Setter 또한 만들 필요 없이 생성자에서 값을 할당한다.
다만 이것도 Builder 패턴을 통해 값을 할당이 가능하기 때문에 그러는것이 좋다.

VO 란

Dto와 다르게 Read-Only 속성을 가진다.
자바에서 단순히 값 타입을 표현하기 위해 불변 클래스를 만들어 사용한다.
VO의 핵심 역할은 equals()와 hashcode() 를 오버라이딩 하는 것이다.

DTO 와 VO 차이

참고 링크 : 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 라고 정의하는 형태이다.


profile
코린이

0개의 댓글