여니의 프로그래밍 study 225

[스프링부트] HTTP 구조 - header , body

HTTP 많이 들어본 용어인데 막상 설명하려고 하니까 입이 떨어지지 않아서 개념정리도 할 겸 포스팅 시작합니다. HTTP는 HyperText Transport Protocol의 약자입니다. 문서를 전송하기 위한 약속으로 해석됩니다. HTML 문서와 같은 리소스들을 가져올 수 있도록 해주는 프로토콜입니다. 서버와 클라이언트 사이에서 어떻게 메세지를 교환할 지 정해놓은 규칙입니다. 80번 포트를 사용하고 HTTP의 구조는 요청(Request)와 응답(Response)으로 구성되어 있습니다. HTTP 요청/응답 메세지는 HTTP 헤더와 HTTP 본문으로 이루어져있습니다. 1. HTTP 헤더 : HTTP 본문 및 요청/응답에 대한 정보를 포함합니다. 해당 메세지가 제공하는 기능에 대한 최소한의 정보가 정리된 요..

[스프링부트] PostApiControllerTest.java (게시글 등록)

Posts.java (Entity 클래스) PostsRepository.java PostSaveRequestDto.class (web -> dto) PostsService.java (서비스) PostsApiController (컨트롤러) 등록하기 테스트 @Test public void Posts_등록된다() throws Exception{ //given String title="title1"; String content="content1"; PostSaveRequestDto requestDto=PostSaveRequestDto.builder() .title(title) .content(content) .author("author") .build(); String url="http://localhost:"..

[스프링부트] @Autowired와 private final 차이점

책을 읽으며 따라하다 보니까 의문이 생겼습니다. 어떤 클래스에서는 @ Autowired를 쓰고, 또 어떤 클래스에서는 private final을 이용해서 의존성을 주입하고,, 둘의 차이가 궁금해졌습니다. 일단 스프링 프레임워크에서 의존성을 주입하는 방식은 총 3가지 입니다 . private final (생성자 주입 : Constructor Injection) > 생성자 기반 DI @Autowired ( 필드 주입 : Field Injection) > 필드에 자동으로 의존성이 주입됩니다. setter (수정자 주입 : Setter Injection) > 수정자 주입 참고로 @Autowired와 seeter는 필드를 final로 선언할 수 없습니다. 가장 권장하는 방식은 생성자로 주입받는 방식입니다. @Au..

[스프링부트] 순환 참조 문제란?

순환 참조 문제란 정확히 무엇일까요? A 클래스가 B 클래스의 Bean을 주입받고, B 클래스가 A 클래스의 Bean을 주입받는 상황으로 서로 순환되어 참조할 경우, 발생하는 문제입니다. 이 문제가 왜 일어나죠? 필드 주입 방식과 수정자 주입 방식에서는 위 같은 상황이 일어나더라도 애플리케이션 실행 과정에서 예외가 발생하지 않습니다. 당장에는 문제가 생기지 않지만, 문제가 되는 순간은 실제로 해당 메소드가 호출되었을 때 입니다. 하지만 위 상황은 순환참조 문제가 아닙니다. 서로 다른 메소드가 서로 호출을 할 때 생기는 순환호출 문제입니다. 생성자 주입 방식에서의 순환참조 문제에 대해 다뤄보기 전, 생성자 주입 방식의 동작원리에 대해 알아봐야합니다. A클래스가 B클래스를 의존하고, B클래스가 C클래스를 의..

[스프링부트] 트랜잭션의 의미와 사용 이유

트랜잭션이란? > 데이터베이스의 상태를 변경시키기 위해 수행하는 작업의 단위를 의미합니다. 데이터베이스의 상태를 변경시킨다는 의미는 select, update, delete, insert와 같은 행동을 의미합니다. 이러한 트랜잭션은 상황에 따라 여러개가 만들어질 수 있습니다. 그 하나의 트랜잭션은 commit(저장)되거나 rollback(철회) 될 수 있습니다. A가 B에게 만원을 송금한다고 가정하면, A는 먼저 통장에서 만원을 인출하고, B의 통장에 만원을 입금해야합니다. 이때 인출과 입금의 두 가지 작업이 합쳐져서 '송금'이라는 하나의 논리적인 기능을 이루게 됩니다. A의 통장에서 만원이 인출이 되었는데, B의 통장으로 입금하는 과정이 실패하면? 다시 송금 기능을 수행해야 합니다. 잘못된 처리니까요 ..

[스프링부트] 실제로 실행된 쿼리 보는 방법

실제로 실행된 쿼리를 보는 방법에 대해 알아보겠습니다. application.properties 파일에 들어가서 spring.jpa.show_sql=true 위 코드를 복붙해줍니다. 그리고 다시 테스트를 실행하면? 위와 같이 콘솔에서도 쿼리 로그를 확인할 수 있습니다!! insert 구문이 실행되었구나, 라는 걸 알 수 있고 cleanup() 메소드를 통해 모든 내용이 테이블에서 지워졌구나를 짐작할 수 있습니다. https://eboong.tistory.com/521?category=958623 [스프링부트] Spring boot JPA 테스트 코드 작성하기 Posts.java -> Entity 클래스입니다. package com.yeony.web.springbootwebproject.domain.pos..

[스프링부트] Spring boot JPA 테스트 코드 작성하기

Posts.java -> Entity 클래스입니다. package com.yeony.web.springbootwebproject.domain.posts; import lombok.Builder; import lombok.Getter; import lombok.NoArgsConstructor; import javax.persistence.*; @Getter @NoArgsConstructor @Entity public class Posts { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; @Column(length = 500,nullable = false) private String title; @Column(columnDe..

[스프링부트] Spring 웹 계층

1. Web ( Controller, View ) - 컨트롤러와 뷰 템플릿 영역입니다. - 필터, 인터셉터, 컨트롤러 어드바이스 등 외부 요청과 응답에 대한 영역을 의미합니다. 2. Service - @Service에 사용되는 서비스 영역입니다. - 일반적으로 Controller와 Dao 중간 영역에서 사용됩니다. - @Transactional이 사용되는 영역입니다. 트랜잭션과 도메인 간의 순서만 보장해줍니다. 3. Repository -> interface로 생성 - Database와 같이 DB 저장소에 접근하는 영역입니다. - DAO(Data Access Object) 영역이라고 생각하면 됩니다. JpaRepository을 상속해주면, 기본적인 CRUD가 생성됩니다. (자동으로) Entity 클래스와..

[스프링부트] JPA가 무엇이고, 왜 써야 하는가!?

JPA는 자바 표준 ORM입니다. ORM ( Object Relational Mapping) : 객체-관계 매핑의 줄임말입니다. 객체라는 개념을 구현한 클래스와 테이블을 자동으로 매핑(연결)하는 것을 의미합니다. 1. 단순 반복 작업 : 수십, 수백개의 테이블의 SQL을 만들고 유지보수 해야하는 단순 반복 작업을 하게 되는 걸 ORM이 해결해줍니다. 2. 패러다임 불일치 문제 그러나 클래스와 테이블이 애초에 호환가능성을 염두해두고 만들어진 것이 아니기 때문에 불일치가 발생하게 됩니다. 이를 ORM을 통해 해결할 수 있습니다. 객체 간의 관계를 바탕으로 SQL 문을 자동으로 생성하기 때문입니다. ORM을 사용하면 직접 따로 SQL문을 짤 필요 없이 클래스의 메서드를 통해, 객체를 통해서 간접적으로 DB를 ..