여니의 프로그래밍 study/Spring & Spring Boot 63

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

트랜잭션이란? > 데이터베이스의 상태를 변경시키기 위해 수행하는 작업의 단위를 의미합니다. 데이터베이스의 상태를 변경시킨다는 의미는 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를 ..

[스프링부트] MockMvc 관련 메소드

private MockMvc mvc : 웹 API 테스트(GET,POST 등) 진행시 사용합니다. 스프링 MVC 테스트의 시작점입니다. mvc.perform(get("/hello")) : MockMVC를 통해 /hello 주소로 HTTP GET 요청을 합니다. 체이닝이 지원됩니다. .andExpect() : 응답 결과를 검증합니다. - 상태코드 : status() .isOk() : 200 .isNotFound() : 404 .isMethodNotAllowed() : 405 .isInternalServerError() : 500 .is(int status) : status 상태코드 - 리턴하는 뷰 이름 검증 : view() .name("example") > 리턴하는 뷰 이름이 example인가! - 리다이..

[스프링부트] 값 넘겨주는 유닛 테스트코드 작성하기(RequestParam)

@RequestParam은 외부에서 API로 넘긴 파라미터를 가져오는 어노테이션입니다. @RequestParam("가져올 데이터의 이름") [데이터타입] [가져온 데이터를 담을 변수] HelloResponseDto.java 응답 데이터를 받을 dto 클래스입니다. package com.yeony.web.springbootwebproject.web.dto; import lombok.Getter; import lombok.RequiredArgsConstructor; @Getter @RequiredArgsConstructor public class HelloResponseDto { private final String name1; private final int amount1; } HelloResponseDt..

[스프링부트] error: variable name not initialized in the default

테스트 코드를 돌렸더니 위와 같은 에러가 떴습니다. @Getter를 이용해서 선언된 모든 필드의 get 메서드를 생성해줬습니다. 그리고 @RequiredArgsConstructor를 이용해서 선언된 모든 final 필드가 모함된 생성자를 생성해줍니다. 물론 final이 안 붙어있으면 생성해주지 않습니다. 위와 같이 오류가 나는 이유는 그래들 버전이 5로 올라가면서 lombok을 프로젝트에 추가해주는 방법이 달라졌기 때문입니다. 책에 적혀 있는대로만 하면 안되더라구요.. 롬북을 사용하려면 아래와 같이 총 4개의 구문을 적어주어야합니다. 테스트 성공!

[스프링부트] assertThat 인식 안되는 문제 해결

AssertJ란? : 자바 JUnit의 테스트코드에 사용되어, 테스트코드의 가독성과 편의성을 높여주는 라이브러리입니다. 메서드 체이닝을 지원해서 더 직관적이고 읽기 쉬운 테스트코드 작성이 가능합니다. 참고로 자바 8 이상은 AssertJ 3.x버전을 사용해야 합니다. static import를 통해 AssertJ의 다양한 API를 클래스 이름 없이 사용이 가능합니다. AssertJ에서 모든 테스트 코드는 assertThat()으로 시작합니다. assertThat(테스트타겟).메소드1().메소드2(). ... 다양한 메소드를 확인할 수 있는 사이트! https://www.javadoc.io/doc/org.assertj/assertj-core/latest/org/assertj/core/api/package-..

[스프링부트] 롬북(lombok)의 개념, 설치 방법 | maven repository

참고서적 : 스프링 부트와 AWS로 혼자 구현하는 웹 서비스 롬북을 사용하는 이유가 뭔지 궁금했습니다. 일단 그래서 롬북의 개념에 대해 알아봤습니다. 롬북을 사용하지 않으면 모델 객체마다 반복적으로 getter나 setter 메소드를 생성해줘야합니다. 변수명이 바뀌게 되는 경우에도 다시 만들어줘야하는 번거로움이 있습니다. 그래서 롬북을 사용하게 되면 @annotation으로 위 역할을 대신 해줍니다. 즉 정리하자면 롬북은 어노테이션을 통해 특정 메서드를 자동으로 생성해주는 라이브러리입니다. 참고로 롬북은 프로젝트마다 설정해줘야합니다. 물론 플러그인은 한 번만 하면 됩니다. (2번 과정) 1번과 3번 과정을 프로젝트마다 해줘야합니다. 1. build.gradle 파일에 아래와 같이 ..