<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <title>dev_beom.log</title>
        <link>https://velog.io/</link>
        <description>개발 초보</description>
        <lastBuildDate>Thu, 18 Mar 2021 15:21:07 GMT</lastBuildDate>
        <docs>https://validator.w3.org/feed/docs/rss2.html</docs>
        <generator>https://github.com/jpmonette/feed</generator>
        <copyright>Copyright (C) 2019. dev_beom.log. All rights reserved.</copyright>
        <atom:link href="https://v2.velog.io/rss/dev_beom" rel="self" type="application/rss+xml"/>
        <item>
            <title><![CDATA[[Error]Spring boot에서 Transactional(option)이 되지 않는 경우]]></title>
            <link>https://velog.io/@dev_beom/ErrorSpring-boot%EC%97%90%EC%84%9C-Transactionaloption%EC%9D%B4-%EB%90%98%EC%A7%80-%EC%95%8A%EB%8A%94-%EA%B2%BD%EC%9A%B0</link>
            <guid>https://velog.io/@dev_beom/ErrorSpring-boot%EC%97%90%EC%84%9C-Transactionaloption%EC%9D%B4-%EB%90%98%EC%A7%80-%EC%95%8A%EB%8A%94-%EA%B2%BD%EC%9A%B0</guid>
            <pubDate>Thu, 18 Mar 2021 15:21:07 GMT</pubDate>
            <description><![CDATA[<p>Service단에 각 트랜잭션들을 등록해 놓는데, 게시글 목록 조회 기능을 읽기 전용 트랜잭션으로 처리해야 해서</p>
<p>@Transactional(readOnly = true)</p>
<p>이렇게 작성을 했다. 근데 불러와지지 않는다.</p>
<h3 id="해결">해결</h3>
<p>javax.transaction.Transactional 를
org.springframework.transaction.annotation.Transactional로</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[2] JPA로 데이터베이스 다루기]]></title>
            <link>https://velog.io/@dev_beom/2-JPA%EB%A1%9C-%EB%8D%B0%EC%9D%B4%ED%84%B0%EB%B2%A0%EC%9D%B4%EC%8A%A4-%EB%8B%A4%EB%A3%A8%EA%B8%B0</link>
            <guid>https://velog.io/@dev_beom/2-JPA%EB%A1%9C-%EB%8D%B0%EC%9D%B4%ED%84%B0%EB%B2%A0%EC%9D%B4%EC%8A%A4-%EB%8B%A4%EB%A3%A8%EA%B8%B0</guid>
            <pubDate>Wed, 17 Mar 2021 05:02:01 GMT</pubDate>
            <description><![CDATA[<blockquote>
<p>MyBatis, iBatis는 ORM이 아니다. SQL Mapper이다.
가끔은 ORM에 대해 MyBAtis, iBatis를 얘기하게 되는데 이 둘은 ORM이 아니다.
ORM은 객체를 매핑하는 것이고, SQL Mapper는 쿼리를 매핑한다.
<strong>ORM(Object Relational Mapping)</strong></p>
</blockquote>
<h3 id="jpa-소개">JPA 소개</h3>
<p>서로 지향하는 바가 다른 2개 영역(객체지향 프로그래밍 언어와 관계형 데이터베이스)을 <strong>중간에서 패러다임 일치</strong>를 시켜주기 위한 기술.
즉, 개발자는 <strong>객체지향적으로 프로그래밍을 하고</strong>, JPA가 이를 관계형 데이터베이스에 맞게 SQL을 대신 생성해서 실행한다.
개발자는 항상 객체지향적으로 코드를 표현할 수 있으니 더는 <strong>SQL에 종속적인 개발을 하지 않아도 된다.</strong></p>
<h4 id="spring-data-jpa">Spring Data JPA</h4>
<p>JPA는 인터페이스로서 자바 표준명세서다.
인터페이스인 JPA를 사용하기 위해서는 구현체가 필요하다.
대표적으로 <a href="https://github.com/hibernate/hibernate-orm">Hibernate</a>, <a href="https://github.com/eclipse-ee4j/eclipselink">Eclipse Link</a>등이 있다.
하지만 Spring에서 JPA를 사용할 때는 이 구현체들을 직접 다루진 않는다.</p>
<p>구현체들을 좀 더 쉽게 사용하고자 추상화시킨 <strong>Spring Data JPA</strong>라는 모듈을 이용하여 JPA 기술을 다룬다.
이들의 관계를 보면 다음과 같다.</p>
<ul>
<li>JPA ← Hibernate ← Spring Data JPA</li>
</ul>
<p>Hibernate를 쓰는 것과 Spring Data JPA를 쓰는 것 사이에는 큰 차이가 없다.
그럼에도 스프링 진영에서는 Spring Data JPA를 개발했고, 이를 권장하고 있다.</p>
<p>이렇게 한 단계 더 감사놓은 Spring Data JPA가 등장한 이유는 크게 두가지가 있다.</p>
<ul>
<li>구현체 교체의 용이성</li>
<li>저장소 교체의 용이성</li>
</ul>
<p>먼저 &#39;구현체 교체 용이성&#39;이란 <strong>Hibernate 외에 다른 구현체로 쉽게 교체하기 위함</strong>이다.</p>
<pre><code>Hibernate가 언젠가 수명을 다해 새로운 JPA 구현체가 대세로 떠오를 때,
Spring Data JPA를 쓰는 중이라면 아주 쉽게 교체할 수 있다.
Spring Data JPA 내부에서 구현체 매핑을 지원해주기 때문이다.</code></pre><p>다음으로 &#39;저장소 교체의 용이성&#39;이란 <strong>관계형 데이터베이스 외에 다른 저장소로 쉽게 교체하기 위함</strong>이다.
서비스 초기엔 관계형 데이터베이스로 모든 기능을 처리했지만,
점점 트래픽이 많아져 관계형 데이터베이스로는 도저히 감당이 안될 때가 올 수 있다.
이 때 MongoDB로 교체가 필요하다면 개발자는 Spring Data JPA에서
<strong>Jpring Data MongoDB로 의존성만 교체</strong>하면 된다.
이는 Spring Data의 하위 프로젝트들은 기본적인 <strong>CRUD의 인터페이스가 같기 때문이다.</strong></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[1] 테스트 코드]]></title>
            <link>https://velog.io/@dev_beom/%ED%85%8C%EC%8A%A4%ED%8A%B8-%EC%BD%94%EB%93%9C</link>
            <guid>https://velog.io/@dev_beom/%ED%85%8C%EC%8A%A4%ED%8A%B8-%EC%BD%94%EB%93%9C</guid>
            <pubDate>Mon, 15 Mar 2021 06:16:59 GMT</pubDate>
            <description><![CDATA[<h3 id="테스트-코드란">테스트 코드란?</h3>
<p>TDD와 단위 테스트(Unit Test)는 다른 이야기다.
TDD는 <strong>테스트가 주도하는 개발</strong>을 이야기하며 <strong>테스트 코드를 먼저 작성</strong>하는 것부터 시작한다.</p>
<p>반면 단위 테스트는 TDD의 첫 번째 단계인 <strong>기능 단위의 테스트 코드를 작성</strong>하는 것을 이야기한다.
TDD와 달리 테스트 코드를 꼭 먼저 작성해야 하는 것도 아니고, 리팩토링도 포함되지 않는다.
순수하게 테스트 코드만 작성하는 것을 이야기한다.</p>
<h4 id="테스트-코드를-작성해야-하는-이유">테스트 코드를 작성해야 하는 이유</h4>
<ul>
<li>단위 테스트는 개발단계 초기에 문제를 발견하게 도와줌</li>
<li>단위 테스트는 개발자가 나중에 코드를 리팩토링하거나 라이브러리 업그레이드 등에서 기존 기능이 올바르게 작동하는지 확인할 수 있음.</li>
<li>단위 테스트는 기능에 대한 불확실성을 감소시킬 수 있음.</li>
<li>단위 테스트는 시스템에 대한 실제 문서를 제공함. 즉, 단위 테스트 자체가 문서로 사용할 수 있음.</li>
</ul>
<h4 id="자바의-테스트-코드-작성-프레임워크는-junit이다">자바의 테스트 코드 작성 프레임워크는 JUnit이다.</h4>
<h3 id="hello-controller-테스트-코드-작성하기">Hello Controller 테스트 코드 작성하기</h3>
<ol>
<li>Java 디렉토리를 마우스 오른쪽 버튼으로 클릭하여 new - package를 차례로 선택</li>
<li>일반적으로 패키지명은 <strong>웹 사이트 주소의 역순</strong>.</li>
<li>예를 들어 admin.example.com이라는 사이트라면 패키지명은 com.example.admin</li>
<li>패키지 이름을 프로젝트 생성시 사용했던 Group Id를 활용해 작성.</li>
<li>패키지 아래에 java 클래스 생성. 패키지와 마찬가지로 마우스 오른쪽 버튼 클릭 후 new - java class를 차례로 선택하면 된다.</li>
<li>클래스의 이름은 <strong>Application</strong>으로 한다.</li>
</ol>
<p>클래스의 코드를 다음과 같이 작성한다.</p>
<pre><code class="language-java">import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class Application {
    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }
}</code></pre>
<p>방금 생성한 Application 클래스는 프로젝트의 <strong>메인 클래스</strong>.</p>
<p><strong>@SpringBootApplication</strong>,으로 인해 스프링 부트의 자동 설정, 스프링 Bean 읽기와 생성을 모두 자동으로 설정됨.
특히나 <strong>@SpringBootApplication이 있는 위치부터 설정을 읽어</strong>가기 때문에 이 클래스는 <strong>항상 프로젝트의 최상단에 위치</strong>해야만 한다.</p>
<p>main 메소드에서 실행하는 <strong>SpringApplication.run</strong>으로 인해 내장 WAS(Web Application Server, 웹 애플리케이션 서버)를 실행한다.
내장 WAS란 별도로 외부에 WAS를 두지 않고 애플리케이션을 실행할 때 내부에서 WAS를 실행하는 것을 이야기한다.
이렇게 되면 항상 서버에 <strong>톰캣을 설치할 필요가 없게 되</strong>고, 스프링 부트로 만들어진 Jar 파일(실행 가능한 Java 패키징 파일)로 실행하면 된다.</p>
<p>스프링 부트에서는 <strong>내장 WAS를 사용하는 것을 권장</strong>한다.
<strong>&#39;언제 어디서나 같은 환경에서 스프링 부트를 배포&#39;</strong> 할 수 있기 때문이다.
외장 AWS를 쓴다고 하면 모든 서버는 WAS의 종류와 버전, 설정을 일치시켜야한다.
새로운 서버가 추가되면 모든 서버가 같은 WAS환경을 구축해야 한다.
하지만 이렇게 내장 WAS를 사용할 경우 이 문제를 모두 해결할 수 있다.</p>
<h4 id="테스트를-위한-controller-만들기">테스트를 위한 Controller 만들기</h4>
<p>현재 패키지 하위에 web이란 패키지를 만들어 본다.</p>
<ol>
<li>위에서 만들어진 패키지를 선택 후 마우스 오른쪽 버튼으로 new - package를 선택한다.
이름은 web이라 한다.</li>
<li><strong>컨트롤러와 관련된 클래스들은 모두 이 패키지</strong>에 담는다.</li>
<li>테스트를 배볼 컨트롤러를 만들어본다.</li>
<li>마찬가지로 마우스 오른쪽 버튼으로 new - java class를 선택한다.</li>
<li>클래스의 이름은 <strong>HelloController</strong>로 한다.</li>
</ol>
<p>생성 후 간단한 API를 작성한다.</p>
<pre><code class="language-java">import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController    // 1
public class HelloController {

    @GetMapping(&quot;/hello&quot;) // 2
    public String hello() {
        return &quot;hello&quot;;
    }
}</code></pre>
<blockquote>
<ol>
<li>@RestController
컨트롤러를 json을 반환하는 컨트롤러로 만들어 준다.
예전에 사용했던 @ResponseBody를 각 메소드마다 선언했던 것을 한번에 사용할 수 있게 해줌.</li>
</ol>
</blockquote>
<blockquote>
<ol start="2">
<li>@GetMapping
HTTP Mathod인 Get의 요청을 받을 수 있는 API를 만들어준다.
예전에는 @RequestMapping(method = RequestMethod GET)으로 사용되었다.
이를통해 /hello로 요청이 오면 문자열 hellp를 반환하는 기능을 가지게 됐다.</li>
</ol>
</blockquote>
<p>작성한 코드가 제대로 작동하는지 테스트를 해본다.</p>
<ol>
<li>WAS를 실행하지 않고, <strong>테스트 코드로 검증</strong>해본다.</li>
<li>src/test/java 디렉토리에 앞에서 생성했던 패키지를 그대로 다시 생성한다.</li>
<li>그리고 테스트 코드를 작성할 클래스를 생성한다.</li>
<li>일반적으로 테스트 클래스는 <strong>대상 클래스 이름에 Test를 붙인다</strong>.</li>
<li>그러므로 여기서는 HelloControllerTest로 생성한다.</li>
<li>생성된 클래스에 아래와 같은 테스트 코드를 추가한다.</li>
</ol>
<pre><code class="language-java">import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.ExtendWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc;
import org.springframework.boot.test.autoconfigure.web.servlet.WebMvcTest;
import org.springframework.test.context.junit.jupiter.SpringExtension;
import org.springframework.test.web.servlet.MockMvc;
import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get;
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.content;
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status;

@ExtendWith(SpringExtension.class) // 1
@WebMvcTest(controllers = {HelloController.class}) // 2
@AutoConfigureMockMvc
public class HelloControllerTest
{

    @Autowired // 3
    private MockMvc mockMvc; // 4

    @Test
    public void hello가_리턴된다() throws Exception{
        String hello = &quot;hello&quot;;

        mockMvc.perform(get(&quot;/hello&quot;)) // 5
                .andExpect(status().isOk()) // 6
                .andExpect(content().string(hello)); // 7
    }
}</code></pre>
<blockquote>
<ol>
<li>@ExtendWith(SpringExtension.class)
테스트를 진행할 때 JUnit에 내장된 실행자 외에 다른 실행자를 실행시킨다.
여기서는 SpringExtension이라는 스프링 실행자를 사용한다.
즉, 스프링 부트 테스트와 JUnit 사이에 연결자 역할을 한다.</li>
</ol>
</blockquote>
<blockquote>
<ol start="2">
<li>@WebMvcTest
여러 스프링 테스트 어노테이션 중, Web(Spring MVC)에 집중할 수 있는 어노테이션이다.
선언할 경우 @Controller, @controllerAdvice등을 사용할 수 있음.
단, @Service, @Component, @Repository등은 사용할 수 없음.
여기서는 컨트롤러만 사용하기 때문에 선언한다.</li>
</ol>
</blockquote>
<blockquote>
<ol start="3">
<li>@Autowired
스프링이 관리하는 빈(Bean)을 주입받는다.</li>
</ol>
</blockquote>
<blockquote>
<ol start="4">
<li>private MockMvc mockMvc
웹 API를 테스트할 때 사용한다.
스프링 MVC 테스트의 시작점이다.
이 클래스를 통해 HEEP GET, POST등에 대한 API 테스트를 할 수 있다.</li>
</ol>
</blockquote>
<blockquote>
<ol start="5">
<li>mockMvc.perform(get(&quot;/hello&quot;))
MockMvc를 통해 /hello 주소로 HTTP GET요청을 한다.
체이닝이 지원되어 아래와 같이 여러 검증 기능을 이어서 선언할 수 있다.</li>
</ol>
</blockquote>
<blockquote>
<ol start="6">
<li>.andExpect(status().isOk())
mockMvc.perform의 결과를 검증한다.
HTTP Header의 Status를 검증한다.
우리가 흔히 알고 있는 200, 404, 500 등의 상태를 검증한다.
여기선 OK 즉, 200인지 아닌지를 검증한다.</li>
</ol>
</blockquote>
<blockquote>
<ol start="7">
<li>.andExpect(content().string(hello))
mockMvc.perform의 결과를 검증한다.
응답 본문의 내용을 검증한다.
Controller에서 &quot;hello&quot;를 리턴하기 때문에 이 값이 맞는지 검증한다.</li>
</ol>
</blockquote>
<p>테스트 코드 실행방법은 <strong>메소드 왼쪽의 화살표를 클릭</strong></p>
<p>브라우저로도 한 번씩 검증은 하되, <strong>테스트 코드는 꼭 따라 해야 한다.</strong> 그래야만 견고한 소프트웨어를 만드는 역량이 성장할 수 있다.</p>
<p>추가로, 절대 <strong>수동으로검증하고 테스트 코드를 작성하진 않는다.</strong> 테스트 코드로 먼저 검증 후, 정말 못믿겠다는 생각이 들 땐 프로젝트를 실행해 확인한다.</p>
<h3 id="롬복-소개-및-설치">롬복 소개 및 설치</h3>
<p>롬복은 <strong>자바 개발자들의 필수 라이브러리</strong>이다.
롬복은 자바 개발할 때 자주 사용하는 코드 Getter, Setter, 기본 생성자, toString등을 어노테이션으로 자동 생성 해준다.</p>
<p>프로젝트에 롬복 설치</p>
<ol>
<li>build.gradle에 다음 코드를 추가한다.<pre><code class="language-java">dependencies {
 ...
 implementation(&#39;org.projectlombok:lombok&#39;)
 annotationProcessor(&#39;org.projectlombok:lombok&#39;)
 testImplementation(&#39;org.projectlombok:lombok&#39;)
 testAnnotationProcessor(&#39;org.projectlombok:lombok&#39;)
}</code></pre>
</li>
<li>Refresh로 라이브러리를 내려받는다.</li>
<li>라이브러리를 다 받았다면 롬복 플러그인을 설치한다.</li>
<li>윈도우(ctrl + shift + a), 맥(command + shift + a)</li>
<li>Action 검색 후 실행</li>
<li>lombok 검색 후 install후 인텔리제이 재실행</li>
<li>settings &gt; build &gt; compiler &gt; annotation processors</li>
<li>Enable annotation processing을 체크한다.</li>
</ol>
<h4 id="hello-controller-코드를-롬복으로-전환하기">Hello Controller 코드를 롬복으로 전환하기</h4>
<ol>
<li>web 패키지에 dto 패키지를 추가한다.</li>
<li>앞으로 <strong>모든 응답 Dto는 이 Dto 패키지에 추가한다.</strong></li>
<li>이 패키지에 HelloResponseDto를 생성한다.</li>
<li>아래와 같이 코드를 작성한다.<pre><code class="language-java">package com.spring_study.springboot.web.dto;
</code></pre>
</li>
</ol>
<p>import lombok.Getter;
import lombok.RequiredArgsConstructor;</p>
<p>@Getter // 1
@RequiredArgsConstructor // 2
public class HelloResponseDto {
    private final String name;
    private final int amount;
}</p>
<pre><code>&gt; 1. @Getter
선언된 모든 필드의 get 메소드를 생성해준다.

&gt; 2. @RequiredArgsConstructor
선언된 모든 final 필드가 포함된 생성자를 생성해준다.
final이 없는 필드는 생성자에 포함되지 않는다.

5. 이 Dto에 적용된 롬복이 잘 작동하는지 테스트 코드를 작성.
6. HelloResponseDtoTest 클래스의 코드는 다음과 같이 작성.
```java
import org.junit.jupiter.api.Test;
import static org.assertj.core.api.Assertions.assertThat;

public class HelloResponseDtoTest {

    @Test
    public void 롬복_기능_테스트(){
        //  givin
        String name = &quot;test&quot;;
        int amount = 1000;

        //  when
        HelloResponseDto dto = new HelloResponseDto(name, amount);

        //  then
        assertThat(dto.getName()).isEqualTo(name); // 1, 2
        assertThat(dto.getAmount()).isEqualTo(amount);
    }
}</code></pre><blockquote>
<ol>
<li>assertThat
assertj라는 테스트 검증 라이브러리의 검증 메소드다.
검증하고 싶은 대상을 메소드 인자로 받는다.
메소드 체이닝이 지원되어 isEqualTo와 같이 메소드를 이어서 사용할 수 있음.</li>
</ol>
</blockquote>
<blockquote>
<ol start="2">
<li>isEqualTo
assertj의 동등 비교 메소드이다.
assertThat에 있는 값과 isEqualTo의 값을 비교해서 같을 때만 성공.</li>
</ol>
</blockquote>
<p>Junit의 기본 assertThat이 아닌 assertj의 assertThat을 사용한 이유
Junit과 비교하여 assertj의 장점은 다음과 같다.</p>
<ul>
<li>CoreMatchers와 달리 추가적으로 라이브러리가 필요하지 않다.<ul>
<li>Junit의 assertThat을 쓰게 되면 is()와 같이 CoreMatchers 라이브러리가 필요하다.</li>
</ul>
</li>
<li>자동완성이 좀 더 확실하게 지원된다.<ul>
<li>IDE에서는 CoreMatchers와 같은 Matcher 라이브러리의 자동완성 지원이 약하다.
<a href="https://www.youtube.com/watch?v=zLx_fI24UXM">assertj의 장점에 대한 자세한 설명</a></li>
</ul>
</li>
</ul>
<p>작성된 테스트 메소드를 실행한 후, 정상적으로 기능이 수행되는 것을 확인했다면
JHelloController에도 새로 만든 ResponseDto를 사용하도록 코드를 추가한다.</p>
<pre><code class="language-Java">    @GetMapping(&quot;/hello/dto&quot;)
    public HelloResponseDto helloDto(
    @RequestParam(&quot;name&quot;) String name, // 1
    @RequestParam(&quot;amount&quot;) int amount) {
        return new HelloResponseDto(name, amount);
    }</code></pre>
<blockquote>
<ol>
<li>@RequestParam
외부에서 API로 넘긴 파라미터를 가져오는 어노테이션
여기서는 외부에서 name(@RequestParam(&quot;name&quot;))이란 이름으로 넘긴 파라미터를 메소드 파라미터 name(String name)에 저장하게 된다.</li>
</ol>
</blockquote>
<p>name과 amount는 API를 호줄하는 곳에서 넘겨준 값들이다.
추가된 API를 테스트하는 코드를 HelloControllerTest에 추가한다.</p>
<pre><code class="language-java">
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.ExtendWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc;
import org.springframework.boot.test.autoconfigure.web.servlet.WebMvcTest;
import org.springframework.test.context.junit.jupiter.SpringExtension;
import org.springframework.test.web.servlet.MockMvc;

import static org.hamcrest.Matchers.is;
import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get;
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.content;
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.jsonPath;
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status;

@ExtendWith(SpringExtension.class)
@WebMvcTest(controllers = {HelloController.class})
@AutoConfigureMockMvc
public class HelloControllerTest
{

    @Autowired
    private MockMvc mockMvc;

    @Test
    public void hello가_리턴된다() throws Exception{
        String hello = &quot;hello&quot;;

        mockMvc.perform(get(&quot;/hello&quot;))
                .andExpect(status().isOk())
                .andExpect(content().string(hello));
    }

    @Test
    public void helloDto가_리턴된다() throws Exception{
        String name = &quot;hello&quot;;
        int amount = 1000;

        mockMvc.perform(get(&quot;/hello/dto&quot;)
        .param(&quot;name&quot;, name) // 1
        .param(&quot;amount&quot;, String.valueOf(amount)))
                .andExpect(status().isOk())
                .andExpect(jsonPath(&quot;$.name&quot;, is(name))) // 2
                .andExpect(jsonPath(&quot;$.amount&quot;, is(amount)));
    }
}</code></pre>
<blockquote>
<ol>
<li>param
API를 테스트할 때 사용될 요청 파라미터를 설정한다.
단, 값은 String만 허용된다.
글서 숫자.날짜 등의 데이터도 등록할 때는 문자열로 변경해야만 가능하다.</li>
</ol>
</blockquote>
<blockquote>
<ol start="2">
<li>jsonPath
json 응답값을 필드별로 검증할 수 있는 메소드다.
$를 기준으로 필드명을 명시한다.
여기서는 name과 amount를 검증하니 $.name, $.amount로 검증한다.</li>
</ol>
</blockquote>
<p>추가된 api도 테스트를 실행한다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[IntelliJ 에서 WSL 사용]]></title>
            <link>https://velog.io/@dev_beom/IntelliJ-%EC%97%90%EC%84%9C-WSL-%EC%82%AC%EC%9A%A9</link>
            <guid>https://velog.io/@dev_beom/IntelliJ-%EC%97%90%EC%84%9C-WSL-%EC%82%AC%EC%9A%A9</guid>
            <pubDate>Tue, 02 Mar 2021 16:41:11 GMT</pubDate>
            <description><![CDATA[<h4 id="개요">개요</h4>
<p>IntelliJ에서 기본 터미널로 WSL 을 사용하는 방법.
WSL은 이미 설치되어 있다고 가정.</p>
<h4 id="방법">방법</h4>
<p>IntelliJ에서</p>
<ol>
<li>File - Settings - Tools - Terminal</li>
<li>Shell path 에 아래 내용 입력<pre><code>&quot;C:\Users\&lt;username&gt;\AppData\Local\Microsoft\WindowsApps\ubuntu.exe&quot; run</code></pre></li>
<li>적용하고 IntelliJ 재실행</li>
</ol>
]]></description>
        </item>
    </channel>
</rss>