본문 바로가기

TIL(Today I Learned)

TIL-230628

📝오늘 공부한 것

  • 스파르타코딩클럽 Spring 입문주차 1주차, 2주차 복습

 

알게 된 점

[Controller]

Controller 있을 때 templates에서 먼저 확인,,

그래서 @ResponseBody해줘야함

view를 반환해야 한다. -> Controller

data를 반환해야 한다. -> ResponseBody

 

@RestController

= @Controller + @ResponseBody

 - @RestController를 사용하면 해당 클래스의 모든 메서드에 @ResponseBody 애너테이션이 추가되는 효과를 부여할 수 있음.

 

[Jackson]

 - JSON 데이터 구조를 처리해주는 라이브러리

 - 직접 JSON 데이터를 처리해야 할 때는 Jackson 라이브러리의 ObjectMapper를 사용

 - "Object To JSON : get Method 필요

 - "JSON To Object : 기본 생성자 & (get OR set) Method 필요

 

[@PathVariable, @RequestParam, @ModelAttribute, @RequesetBody]

@PathVariable : URL 경로에서 변수 값을 추출

@RequestParam : 요청 URL의 쿼리 파라미터에서 값을 추출

@ModelAttribute : 요청 파라미터를 객체로 바인딩

@RequesetBody : 요청 본문(body)에서 데이터를 추출

 

📌데이터를 Java의 객체로 받아올 때 데이터가 제대로 들어오지 않는자면 우선 해당 객체의 set or get 메서드 또는 오버로딩된 생성자의 유무를 확인하기!!

 

[EntityDTO]

Entity :

 - DB의 테이블과 매핑되는 객체

 - DB에서 영속적으로 저장되고 관리되는 상태

 - 주로 JPA(Java Persistence API)와 같은 ORM(Object-Relational Mapping) 기술을 사용하여 DB와 상호작용

 - 비즈니스 로직과 데이터 상태를 가질수 있음

DTO(Data Transfer Object) :

 - 데이터 전송을 위한 객체로, 서로 다른 계층 간에 데이터를 전달하는데 사용

 - 주로 웹 API 또는 서비스 계층과 클라이언트 간의 데이터 전송에 사용

 - 필요한 데이터만 포함하고, 로직을 갖지 않음

 - Entity로부터 필요한 데이터를 추출하여 전송하기 위해 사용될 수 있음

 - 클라이언트의 요구사항에 맞추어 데이터의 구조를 조정하거나 여러 개의 entity로부터 데이터를 수집하여 하나의 객체로 표현할 수 있음.

 

처음 개념을 접했을 때는 entity와 dto가 너무 헷갈렸다,,

두번째 볼때는 대충 어떨때 쓰는지 뭐가 다른지는 알것 같다

그래도 여전히 entity는 어렵다ㅠㅠ

 

처음에 둘다 객체면서 왜 따로쓰는 거야?

뭐가 다른 거야?하고 이해가 안가서 chatGPT한테 물어봤더니 친절하게 알려줬다.

일반적으로 엔티티는 데이터베이스와 관련된 비즈니스 로직 및 영속성을 처리하는 데 사용되고, DTO는 서비스 계층과 클라이언트 간의 데이터 전송을 위해 사용됩니다. 이렇게 구분하여 엔티티와 DTO를 사용하면 데이터 전송 및 관리에 대한 명확한 역할과 책임을 가질 수 있습니다.


비유를 통해 Entity DTO의 차이를 설명해드리겠습니다.


가정해보겠습니다. 여러분이 온라인 상점을 운영한다고 가정해봅시다. 상점에는 상품들을 관리해야 하고, 고객들이 주문을 할 수 있습니다.


Entity는 상품(Product)과 주문(Order)을 나타내는 클래스로 생각해보겠습니다. 이 클래스들은 데이터베이스의 테이블과 매핑되고, 비즈니스 로직을 포함합니다. Entity는 상점의 실제 데이터를 표현하고 관리합니다. 예를 들어, Product 엔티티는 상품의 이름, 가격, 재고량 등과 같은 데이터를 가지고 있을 수 있습니다. Order 엔티티는 주문자의 정보, 주문 상품의 목록, 결제 상태 등과 같은 데이터를 가질 수 있습니다.


DTO는 데이터를 전송하기 위한 객체로 생각해보겠습니다. 상품 정보를 클라이언트에 전달하거나 주문을 생성할 때 사용됩니다. 예를 들어, ProductDTO는 상품의 이름과 가격만을 담고 있는 간단한 구조로 표현될 수 있습니다. OrderDTO는 주문자의 이름과 주문 상품의 목록만을 담고 있는 구조일 수 있습니다.


이 비유에서 Entity는 상점에서 실제로 사용되는 데이터의 형태를 나타내고, 비즈니스 로직을 포함합니다. DTO는 클라이언트와의 데이터 전송을 위한 단순한 구조로 사용됩니다. Entity는 상점 내부에서 데이터베이스와 상호 작용하고 영속성을 갖는 반면, DTO는 외부와의 데이터 전송을 위해 사용되며 비즈니스 로직을 포함하지 않습니다.


간단히 말하면, Entity는 상점의 내부 데이터를 관리하고 처리하는 데 사용되는 클래스이며, DTO는 외부와의 데이터 전송을 위한 간단한 구조로 사용되는 클래스입니다. Entity는 상점 자체를 나타내는 것이고, DTO는 상점과 외부 간의 데이터 흐름을 관리하는 역할을 한다고 비유할 수 있습니다.

 entity는 DB와 관련된 비즈니스 로직 및 영속성을 처리하는 데 사용

dto는 서비스 계층과 클라이언트간의 데이터 전송을 위해 사용

 

https://wildeveloperetrain.tistory.com/101

 

역할 분리를 위한 Entity, DTO 개념과 차이점

'Entity, DTO 개념과 차이점 (+ VO)' - Entity Entity 클래스는 실제 DB 테이블과 매핑되는 핵심 클래스로, 데이터베이스의 테이블에 존재하는 컬럼들을 필드로 가지는 객체입니다. (DB의 테이블과 1:1로 매

wildeveloperetrain.tistory.com

 

 

[Entity]

 @Entity : JPA가 관리할 수 있는 Entity 클래스로 지정

         - @Entity(name = "Memo") : Entity 클래스 이름을 지정 (default: 클래스명)

         - JPAEntity 클래스를 인스턴스화 할 때 기본 생성자를 사용하기 때문에 반드시 현재 Entity 클래스에서 기본 생성자가 생성되고 있는지 확인

 @Table : 매핑할 테이블을 지정

         - @Table(name = "memo") : 매핑할 테이블의 이름을 지정 (default: Entity )

 @Column :

        - @Column(name = "username") : 필드와 매핑할 테이블의 컬럼을 지정 (default: 객체의 필드명)

        - @Column(nullable = false) : 데이터의 null 값 허용 여부를 지정 (default: true)

        - @Column(unique = true) : 데이터의 중복 값 허용 여부를 지정 (default: false)

       - @Column(length = 500) : 데이터 값(문자)의 길이에 제약조건을 걸 수 있음 (default: 255)

@Id : 테이블의 기본 키를 지정

        - 이 기본 키는 영속성 컨텍스트에서 Entity를 구분하고 관리할 때 사용되는 식별자 역할을 수행

        - 따라서 기본 키 즉, 식별자 값을 넣어주지 않고 저장하면 오류가 발생

        - @Id 옵션만 설정하면 기본 키 값을 개발자가 직접 확인하고 넣어줘야 하는 불편함이 발생합니다.

@GeneratedValue :  옵션을 추가하면 기본 키 생성을 DB에 위임

        - @GeneratedValue(strategy = GenerationType.IDENTITY)

        - `id bigint not null auto_increment` : auto_increment 조건이 추가된 것을 확인할 수 있음

        - 해당 옵션을 추가해주면 개발자가 직접 id 값을 넣어주지 않아도 자동으로 순서에 맞게 기본 키가 추가

 

느낀 점🤔

- 확실히 두번째 보니까 이해안가던 것들이 조금 이해가 되는 것 같다.

다음주차 강의부터 엄청 어렵다던데,,,큰일났다

얼마나 어려울지 궁금하구먼....

그래도 2주차까지 복습완료해서 마음이 편하다..!

'TIL(Today I Learned)' 카테고리의 다른 글

TIL-230630  (0) 2023.06.30
TIL-230629(application.properties 민감정보 숨기기)  (0) 2023.06.29
TIL-230626  (0) 2023.06.26
TIL-230624  (0) 2023.06.24
TIL-230623  (0) 2023.06.23