<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>조세영의 Kotlin World</title>
    <link>https://kotlinworld.tistory.com/</link>
    <description>'조세영의 Kotlin World'는 Kotlin를 전문적으로 다루는 개인 기술 블로그입니다. Kotlin 세계에 대한 양질의 자료를 제공하며 Kotlin, Android, Spring,  CI, CD 분야에 대해 다룹니다.</description>
    <language>ko</language>
    <pubDate>Thu, 7 May 2026 01:02:57 +0900</pubDate>
    <generator>TISTORY</generator>
    <ttl>100</ttl>
    <managingEditor>Dev.Cho</managingEditor>
    <image>
      <title>조세영의 Kotlin World</title>
      <url>https://tistory1.daumcdn.net/tistory/4526974/attach/6b5c0785c1ef4763aa19835dcedd1cc1</url>
      <link>https://kotlinworld.tistory.com</link>
    </image>
    <item>
      <title>[Kotlin Spring] WebMvcConfigurer 사용해 CORS 규칙 설정하기</title>
      <link>https://kotlinworld.tistory.com/596</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;문제 상황 및 원인&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;스프링 애플리케이션을 백엔드로 하고, React 애플리케이션을 프론트엔드로 하는 개발하던 중, 다음과 같은 오류를 발견했다.&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;Access to XMLHttpRequest at 'http://localhost:8080/hello?name=world' from origin 'http://localhost:3000' has been blocked by CORS policy: No 'Access-Control-Allow-Origin' header is present on the requested resource.&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;확인해보니, 브라우저는 기본적으로 동일 출처 정책(Same Origin Policy, SOP)을 지키기 때문에 다른 출처의 리소스 접근을 금지해 생기는 문제로 확인됐다. 이를 해결하기 위해서는 스프링 애플리케이션의 CORS(Cross-Origin Resource Sharing) 설정에  특정 주소로부터의 Cross Origin Request를 허용해야 한다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;문제 해결&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Cross Origin Request를 허용하기 위해서는 서버에서 Access-Control-Allow-Origin 헤더를 포함한 응답을 주는 것이 필요하다. 이 Access-Control-Allow-Origin의 값은 요청하는 위치의 주소이다. 예를 들어 http://localhost:8080 에서 실행 중인 스프링 애플리케이션이 http://localhost:3000 로부터의 요청을 허용하고 싶다면 다음과 같은 헤더를 추가하면 된다.&lt;/p&gt;
&lt;pre id=&quot;code_1732844948908&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;Access-Control-Allow-Origin: http://localhost:3000&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그렇다면, 스프링 MVC에서는 위 헤더를 어떻게 추가할 수 있을까? 바로 WebMvcConfigurer을 사용하면 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아래는 실제로 동작하는 WebMvcConfigurer에 대한 설정이다.&lt;/p&gt;
&lt;pre id=&quot;code_1732843924226&quot; class=&quot;kotlin&quot; data-ke-language=&quot;kotlin&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;@Configuration
class WebConfig {
    @Bean
    fun webMvcConfigurer(): WebMvcConfigurer {
        return object : WebMvcConfigurer {
            override fun addCorsMappings(registry: CorsRegistry) {
                registry.addMapping(&quot;/**&quot;)
                    .allowedOrigins(&quot;http://localhost:3000&quot;)
            }
        }
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;WebMvcConfigurer는 addCorsMapping 함수를 오버라이드 해 CORS 설정을 추가할 수 있으며, 이곳의 CorsRegistry의 addMapping 함수를 통해 특정 경로에 대해 Cross Origin Request를 허용 할 수 있다. 여기서는 addMapping(&quot;/**&quot;) 을 사용했는데, 이는 전체 경로에 대한 Cross Origin Request를 허용한다는 뜻이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;만약 /hello 경로 하위에 대해서만 Cross Origin Request를 허용하고 싶다면 다음과 같이 설정하면&amp;nbsp; 된다.&lt;/p&gt;
&lt;pre id=&quot;code_1732845200287&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;registry.addMapping(&quot;/student/**&quot;)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;어떤 경로에 대해 Cross Origin Request를 허용할지 정했으면, 어떤 곳으로부터의 요청을 허용할지도 정해야 한다. React 애플리케이션은 로컬에서 일반적으로 3000번 포트를 사용하므로 http://localhost:3000 을 허용해주면 React 애플리케이션에서 Spring 애플리케이션에 HTTP 요청을 할 수 있게 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이제 이렇게 설정한 후  리액트 애플리케이션에서 스프링 애플리케이션에 HTTP 요청을 실행해보면, 다음과 같은 헤더와 함께 성공 응답이 오는 것을 볼 수 있다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2024-11-29 오전 10.56.12.png&quot; data-origin-width=&quot;756&quot; data-origin-height=&quot;430&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/79u84/btsKZ4KvtkU/2FNibejFcN2CRGyNJkeuvk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/79u84/btsKZ4KvtkU/2FNibejFcN2CRGyNJkeuvk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/79u84/btsKZ4KvtkU/2FNibejFcN2CRGyNJkeuvk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F79u84%2FbtsKZ4KvtkU%2F2FNibejFcN2CRGyNJkeuvk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;756&quot; height=&quot;430&quot; data-filename=&quot;스크린샷 2024-11-29 오전 10.56.12.png&quot; data-origin-width=&quot;756&quot; data-origin-height=&quot;430&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>Spring/MVC</category>
      <category>CORS</category>
      <category>cross origin request</category>
      <category>Kotlin</category>
      <category>kotlin spring</category>
      <category>Spring MVC</category>
      <category>webmvcconfigurer</category>
      <category>스프링</category>
      <category>스프링 MVC</category>
      <category>코틀린</category>
      <author>Dev.Cho</author>
      <guid isPermaLink="true">https://kotlinworld.tistory.com/596</guid>
      <comments>https://kotlinworld.tistory.com/596#entry596comment</comments>
      <pubDate>Fri, 6 Dec 2024 07:56:49 +0900</pubDate>
    </item>
    <item>
      <title>[Spring JPA] 실행된 SQL문 로깅하고 포멧팅 하는 방법 한 번에 정리하기</title>
      <link>https://kotlinworld.tistory.com/595</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;실행된 SQL문의 확인이 필요한 이유&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Spring Data JPA를 사용하면 JpaRepository를 상속해 기본적인 CRUD가 가능한 함수들을 사용할 수 있다. 하지만, 이 함수들을 사용하면, JPA에서 알아서 SQL문을 만들어서 쿼리하기 때문에 어떤 SQL문이 실행되는지 확인하기 어렵다. 대부분의 상황에서 이것은 문제가 되지 않지만, 만약 버그가 일어났다면 어떤 SQL문 때문에 문제가 생겼는지 확인해야 한다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Spring Data JPA는 이를 위해 실행되는 SQL문을 로깅할 수 있는 기능을 제공한다. 지금부터 이 방법에 대해 알아보자.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;실행된 SQL문 로깅하기&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;실행된 SQL문을 로깅하도록 설정하기 위해서는 application.properties 파일에 다음과 같은 설정을 추가해야 한다.&lt;/p&gt;
&lt;pre id=&quot;code_1732444301532&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;spring.jpa.show-sql=true&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그런 후 이전 글에서 만든 다음 addVocabulary 함수를 호출해보자.&lt;/p&gt;
&lt;pre id=&quot;code_1732444401935&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;@RestController
class VocabularyController(
    private val vocabularyRepository: VocabularyRepository
) {
    ...

    @PostMapping(&quot;/vocabulary&quot;)
    fun addVocabulary(
        @RequestParam word: String,
        @RequestParam meaning: String
    ): Vocabulary {
        val vocabulary = Vocabulary(word = word, meaning = meaning)
        return vocabularyRepository.save(vocabulary)
    }

    ...
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;HTTP 요청은 다음과 같다.&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1732444460959&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;POST http://localhost:8080/vocabulary
Content-Type: application/x-www-form-urlencoded

word=abc&amp;amp;meaning=xyz&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그러면 Vocabulary를 입력하는 SQL문이 실행되고, 다음과 같이 성공 응답이 오는 것을 확인할 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2024-11-24 오후 7.35.09.png&quot; data-origin-width=&quot;1108&quot; data-origin-height=&quot;710&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Mc56b/btsKTXK5JnP/1d3hIz4f0kZ3ZNrF0Vvp6k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Mc56b/btsKTXK5JnP/1d3hIz4f0kZ3ZNrF0Vvp6k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Mc56b/btsKTXK5JnP/1d3hIz4f0kZ3ZNrF0Vvp6k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FMc56b%2FbtsKTXK5JnP%2F1d3hIz4f0kZ3ZNrF0Vvp6k%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;600&quot; height=&quot;384&quot; data-filename=&quot;스크린샷 2024-11-24 오후 7.35.09.png&quot; data-origin-width=&quot;1108&quot; data-origin-height=&quot;710&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이제 로그를 확인해보자. 그러면 다음과 같이 어떤 쿼리가 실행됐는지에 대한 정보가 나오는 것을 볼 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2024-11-24 오후 7.35.57.png&quot; data-origin-width=&quot;2420&quot; data-origin-height=&quot;216&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/yYrgG/btsKVQDQ0me/wSQliXpDyU3WMYaUNj4KCK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/yYrgG/btsKVQDQ0me/wSQliXpDyU3WMYaUNj4KCK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/yYrgG/btsKVQDQ0me/wSQliXpDyU3WMYaUNj4KCK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FyYrgG%2FbtsKVQDQ0me%2FwSQliXpDyU3WMYaUNj4KCK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2420&quot; height=&quot;216&quot; data-filename=&quot;스크린샷 2024-11-24 오후 7.35.57.png&quot; data-origin-width=&quot;2420&quot; data-origin-height=&quot;216&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;로깅 시 SQL문 포멧팅 될 수 있도록 하기&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위에서는 어떤 SQL문이 실행됐는지 확인할 수 있지만 포멧팅이 되지 않아 가독성이 나쁘다. 이런 문제를 해결하기 위해 Spring Data JPA는 SQL문을 포멧팅 하는 기능도 제공한다. 포멧팅하는 방법은 간단하다. 단순히 application.properties 파일에 다음과 같은 설정을 추가하면 된다.&lt;/p&gt;
&lt;pre id=&quot;code_1732444795509&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# SQL 포맷팅
spring.jpa.properties.hibernate.format_sql=true&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이제 다시 애플리케이션을 실행해 POST 요청을 날려보자. 그러면 다음과 같이 실행된 SQL문이 포멧팅 되는 것을 확인할 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2024-11-24 오후 7.40.33.png&quot; data-origin-width=&quot;1124&quot; data-origin-height=&quot;760&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b5jDYf/btsKVLQbJX7/gEaKQb4rYaJQTfbDjrLuqk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b5jDYf/btsKVLQbJX7/gEaKQb4rYaJQTfbDjrLuqk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b5jDYf/btsKVLQbJX7/gEaKQb4rYaJQTfbDjrLuqk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb5jDYf%2FbtsKVLQbJX7%2FgEaKQb4rYaJQTfbDjrLuqk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;500&quot; height=&quot;338&quot; data-filename=&quot;스크린샷 2024-11-24 오후 7.40.33.png&quot; data-origin-width=&quot;1124&quot; data-origin-height=&quot;760&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;전체 코드:&amp;nbsp;&lt;a href=&quot;https://github.com/seyoungcho2/LearnSpringKotlin/blob/main/database/db-jpa/src/main/resources/application.properties&quot;&gt;GitHub&lt;/a&gt;&lt;br /&gt;이 프로젝트가 도움이 되셨다면 &lt;a href=&quot;https://github.com/seyoungcho2/LearnSpringKotlin&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;저장소&lt;/a&gt;에 Star⭐️를 눌러주세요! &lt;a href=&quot;https://github.com/seyoungcho2/LearnSpringKotlin/stargazers&quot;&gt;Stargazers&lt;/a&gt;는 다음 페이지에서 확인할 수 있습니다.&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>Spring/Database</category>
      <category>hibernate</category>
      <category>JPA</category>
      <category>kotlin spring</category>
      <category>Spring Data JPA</category>
      <category>spring.jpa.properties.hibernate.format_sql</category>
      <category>spring.jpa.show-sql</category>
      <category>sql</category>
      <category>로깅</category>
      <category>스프링</category>
      <category>코틀린</category>
      <author>Dev.Cho</author>
      <guid isPermaLink="true">https://kotlinworld.tistory.com/595</guid>
      <comments>https://kotlinworld.tistory.com/595#entry595comment</comments>
      <pubDate>Thu, 5 Dec 2024 07:43:09 +0900</pubDate>
    </item>
    <item>
      <title>[Kotlin Spring JPA] JpaRepository, @Query 사용해 데이터베이스에 쿼리 하는 방법 한 번에 정리하기</title>
      <link>https://kotlinworld.tistory.com/594</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;시작하며&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이전 글에서 우리는 DB를 만들고 커넥션을 설정한 다음, 테이블을 만드는 작업을 했다.&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;&lt;a href=&quot;https://kotlinworld.tistory.com/592&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;코틀린 스프링 프로젝트에 Spring Data JPA 와 H2 Database 사용 설정하기&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://kotlinworld.tistory.com/593&quot;&gt;[Kotlin Spring JPA] @Entity, @Table, @Id, @Column 사용해 Table 정보 설정하는 방법 한 번에 정리하기&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이제 테이블을 만들었으니, 이번 글에서는 쿼리를 만들어 실행해보자.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;일반적으로 쿼리를 실행하기 위해서는 쿼리문을 작성해야 하지만, Spring Data JPA를 사용하면 기본적인 쿼리문을 모두 기본으로 생성되게 만들 수 있는데 이런 역할을 하는 것이 바로 JpaRepository이다. 지금부터 JpaRepository를 사용해 쿼리를 만들어 실행해보자.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;JpaRepository 상속 받는 객체 만들기&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;JpaRepository를 사용하는 방법은 간단하다. 예를 들어 다음과 같은 Vocabulary 엔티티가 있다고 해보자.&lt;/p&gt;
&lt;pre id=&quot;code_1732436802216&quot; class=&quot;kotlin&quot; data-ke-language=&quot;kotlin&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;@Entity
data class Vocabulary(
    @Id
    val id: String = UUID.randomUUID().toString(),
    val word: String,
    val meaning: String
)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그러면 이 JpaRepository&amp;lt;Vocabulary, String&amp;gt; 을 상속하는 VocabularyRepository 인터페이스를 다음과 같이 만들면 이 VocabularyRepository는 자동으로 Bean으로 등록된다.&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1732436838489&quot; class=&quot;kotlin&quot; data-ke-language=&quot;kotlin&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;interface VocabularyRepository: JpaRepository&amp;lt;Vocabulary, String&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;여기서&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;JpaRepository는&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;JpaRepository&amp;lt;t, id=&quot;&quot;&amp;gt; 라는 제네릭 타입을 갖는데, ID는 바로 Vocabulary를 구분할 수 있는 단일 ID 값이 되며 일반적으로 Primary Key로 등록되는 타입을 사용하면 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이제 JpaRepository가 만들어졌으니 이걸 사용해 데이터 베이스에 쿼리를 실행하는 컨트롤러를 만들어보자.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;JpaRepository 사용해 쿼리 실행하기&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;JpaRepository를 사용해 쿼리를 실행하는 방법은 간단하다. JpaRepository를 상속 받은 인터페이스인 VocabularyRepository가 Bean으로 등록되었으므로, 이를 사용해 쿼리를 실행하면 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이때 JpaRepository에는 CRUD를 위한 findById, findAll, save, deleteById 등의 메서드가 이미 정의되어 있기 때문에 다음과 같이 직접 쿼리를 작성할 필요 없이 코틀린 코드만 작성하면 되며, 그러면&amp;nbsp;원하는&amp;nbsp;쿼리가&amp;nbsp;실행된다.&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1732437136137&quot; class=&quot;kotlin&quot; data-ke-language=&quot;kotlin&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;@RestController
class VocabularyController(
    private val vocabularyRepository: VocabularyRepository
) {
    @GetMapping(&quot;/vocabulary&quot;)
    fun getVocabularyById(@RequestParam id: String): Vocabulary {
        return vocabularyRepository.findById(id).get()
    }

    @GetMapping(&quot;/vocabulary/all&quot;)
    fun getAllVocabulary(): List&amp;lt;Vocabulary&amp;gt; {
        return vocabularyRepository.findAll()
    }

    @PostMapping(&quot;/vocabulary&quot;)
    fun addVocabulary(
        @RequestParam word: String,
        @RequestParam meaning: String
    ): Vocabulary {
        val vocabulary = Vocabulary(word = word, meaning = meaning)
        return vocabularyRepository.save(vocabulary)
    }

    @DeleteMapping
    fun deleteVocabulary(@RequestParam id: String) {
        vocabularyRepository.deleteById(id)
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위의 코드의 findById 함수를 보면 인자로 id를 넘기고 있는데, 이 Id는 Vocabulary 객체에서 @Id 어노테이션이 붙은 필드인 id에 대응된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이처럼 쿼리를 직접 작성하지 않고도 손쉽게 쿼리를 실행할 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;@Query 사용해 커스텀 쿼리 만들기&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;JpaRepository는 기본적인 CRUD 쿼리만을 정의하고 있기 때문에 종종 JpaRepository에 정의된 쿼리 함수들 만으로 충분하지 않은 경우가 있다. 예를 들어 word를 사용해 검색 시스템을 만드는 경우를 생각해보자. 이런 경우는 검색을 위해 LIKE 문을 사용해야 하는데, JpaRepository에는 이런 쿼리 함수가 정의되어 있지 않다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이런 경우에는 JpaRepository를 상속 받는 Repository 안에 @Query 어노테이션을 사용해 커스텀 쿼리를 직접 작성하면 된다. 만약 인자를 커스텀 쿼리 내부로 넘겨야 한다면 @Query에는 %:[인자명]% 을 적고, 함수의 인자에는 @Param(&quot;[인자명]&quot;) 과 함께 인자를 넘기면 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;예를 들어 word를 사용해 검색을 하는 함수는 다음과 같이 만들 수 있다.&lt;/p&gt;
&lt;pre id=&quot;code_1732437444385&quot; class=&quot;kotlin&quot; data-ke-language=&quot;kotlin&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;interface VocabularyRepository: JpaRepository&amp;lt;Vocabulary, String&amp;gt; {
    @Query(&quot;SELECT v FROM Vocabulary v WHERE v.word LIKE %:word%&quot;)
    fun searchByWord(@Param(&quot;word&quot;) word: String): List&amp;lt;Vocabulary&amp;gt;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이곳에서는 @Param(&quot;word&quot;) word: String 를 받아 이를 LIKE 문 뒤에 %:word% 형태로 넣고 있다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;추가 자료&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;JpaRepository는 어떻게 Bean으로 등록되는가?&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;JpaRepository 내부를 보면 @NoRepositoryBean만 붙어 있을 뿐 @Component 어노테이션이 붙어있지 않다. @NoRepositoryBean은 레포지토리를 표시하는 메서드를 정의하는 인터페이스라는 것을 명시하고 해당 인터페이스를 실제 Bean객체로 등록되지 않게 하는 역할을 하기 때문에 Bean으로 등록되지 않는다.&lt;/p&gt;
&lt;pre id=&quot;code_1732437811412&quot; class=&quot;kotlin&quot; data-ke-language=&quot;kotlin&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;@NoRepositoryBean
public interface JpaRepository&amp;lt;T, ID&amp;gt; extends ListCrudRepository&amp;lt;T, ID&amp;gt;, ListPagingAndSortingRepository&amp;lt;T, ID&amp;gt;, QueryByExampleExecutor&amp;lt;T&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이를 처리하는 것은 @EnableJpaRepositories 이라는 어노테이션으로, @EnableJpaRepositories를 사용하면 특정 패키지 하위의 JpaRepository를 스캔해 Bean으로 별도로 등록해준다. 예를 들어 com.somepackage 하위의 모든 JpaRepository를 등록하려면 다음과 같이 작성 후 이를 애플리케이션 클래스 위에 붙여 주면 된다.&lt;/p&gt;
&lt;pre id=&quot;code_1732438239896&quot; class=&quot;kotlin&quot; data-ke-language=&quot;kotlin&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;@EnableJpaRepositories(value = [&quot;com.somepackage&quot;])&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다만 이것은 스프링 부트를 사용하면 @SpringBootApplication이 붙어 있는 패키지와 하위 패키지에 대해 생략이 가능하다고 한다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;전체 코드:&amp;nbsp;&lt;a href=&quot;https://github.com/seyoungcho2/LearnSpringKotlin/tree/main/database/db-jpa&quot;&gt;GitHub&lt;/a&gt;&lt;br /&gt;이 프로젝트가 도움이 되셨다면 &lt;a href=&quot;https://github.com/seyoungcho2/LearnSpringKotlin&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;저장소&lt;/a&gt;에 Star⭐️를 눌러주세요! &lt;a href=&quot;https://github.com/seyoungcho2/LearnSpringKotlin/stargazers&quot;&gt;Stargazers&lt;/a&gt;는 다음 페이지에서 확인할 수 있습니다.&lt;/blockquote&gt;</description>
      <category>Spring/Database</category>
      <category>@EnableJpaRepositories</category>
      <category>@norepositorybean</category>
      <category>@Query</category>
      <category>kotlin spring</category>
      <category>parepository</category>
      <category>Spring</category>
      <category>데이터베이스</category>
      <category>스프링 부트</category>
      <category>코틀린</category>
      <category>쿼리</category>
      <author>Dev.Cho</author>
      <guid isPermaLink="true">https://kotlinworld.tistory.com/594</guid>
      <comments>https://kotlinworld.tistory.com/594#entry594comment</comments>
      <pubDate>Wed, 4 Dec 2024 07:53:18 +0900</pubDate>
    </item>
    <item>
      <title>[Kotlin Spring JPA] @Entity, @Table, @Id, @Column 사용해 Table 정보 설정하는 방법 한 번에 정리하기</title>
      <link>https://kotlinworld.tistory.com/593</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;@Entity와 @Id 어노테이션 사용해 테이블 정의하기&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;특정 클래스에 @Entity 어노테이션을 사용하면 테이블을 정의할 수 있다.&amp;nbsp;예를 들어 단어 정보를 저장하기 위한 Vocabulary 테이블을 정의한다고 해보자. 이런 테이블은 다음과 같이 정의될 수 있다.&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1732428850171&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;@Entity
data class Vocabulary(
    @Id
    val id: String = UUID.randomUUID().toString(),
    val word: String,
    val meaning: String
)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 테이블의 이름은 클래스의 이름과 같은 Vocabulary가 되며, 내부에는 아이디 id, 단어 word,&amp;nbsp; 뜻 meaning 세가지 필드를 가진다. 테이블에는 꼭 Primary Key가 필요하기 때문에 id 변수 위에는 @Id 어노테이션을 붙여 이 필드가 Primary Key라는 것을 알려야 한다. 이렇게 만든 후 스프링 애플리케이션을 실행하면 다음과 같이 VOCABULARY 테이블과 내부에 선언된 ID, MEANING, WORD 컬럼을 확인할 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2024-11-24 오후 3.24.37.png&quot; data-origin-width=&quot;398&quot; data-origin-height=&quot;314&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bpwKQ1/btsKTYiSrVa/k2xIIWkmMWwdstAxUORJJ1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bpwKQ1/btsKTYiSrVa/k2xIIWkmMWwdstAxUORJJ1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bpwKQ1/btsKTYiSrVa/k2xIIWkmMWwdstAxUORJJ1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbpwKQ1%2FbtsKTYiSrVa%2Fk2xIIWkmMWwdstAxUORJJ1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;350&quot; height=&quot;276&quot; data-filename=&quot;스크린샷 2024-11-24 오후 3.24.37.png&quot; data-origin-width=&quot;398&quot; data-origin-height=&quot;314&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;여기서 중요한 것은 꼭 @Entity가 붙은 클래스가 있다면 테이블로 만들어지게 되기 때문에 @Id가 붙은 필드가 있어야 한다는 점이다. 만약 없다면 다음과 같이 Primary Key가 있어야 한다는 경고 문구가 나온다.&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2024-11-24 오후 3.26.27.png&quot; data-origin-width=&quot;1166&quot; data-origin-height=&quot;666&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/teOiM/btsKUHVjxUQ/CDRDYcOS9QVsKKEvx8QtM0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/teOiM/btsKUHVjxUQ/CDRDYcOS9QVsKKEvx8QtM0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/teOiM/btsKUHVjxUQ/CDRDYcOS9QVsKKEvx8QtM0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FteOiM%2FbtsKUHVjxUQ%2FCDRDYcOS9QVsKKEvx8QtM0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;600&quot; height=&quot;343&quot; data-filename=&quot;스크린샷 2024-11-24 오후 3.26.27.png&quot; data-origin-width=&quot;1166&quot; data-origin-height=&quot;666&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;Persistent&amp;nbsp;entity&amp;nbsp;'Vocabulary'&amp;nbsp;should&amp;nbsp;have&amp;nbsp;primary&amp;nbsp;key&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;영속성 엔티티인 Vocabulary는 Primary Key가 있어야 합니다.&amp;nbsp;&lt;/span&gt;&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이처럼 테이블을 만드는 것은 매우 간단하다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이어서 이 Entity에 다양한 옵션을 적용하는 방법을 알아보자.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;@Entity의 name 프로퍼티 설정해 테이블 이름 설정하기&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;@Entity의 name 프로퍼티를 사용하면 테이블의 이름을 커스텀하게 설정할 수 있다. 예를 들어 테이블의 이름을 Vocabulary가 아닌, Voca로 설정하고 싶다면 다음과 같이 name 프로퍼티를 &quot;Voca&quot;로 설정하면 된다.&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1732429823772&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;@Entity(name = &quot;Voca&quot;) // Entity명 지정도 가능
data class Vocabulary(
    @Id
    val id: String = UUID.randomUUID().toString(),
    val word: String,
    val meaning: String
)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그러면 다음과 같이 테이블의 이름이 VOCA로 변경되는 것을 볼 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2024-11-24 오후 3.31.10.png&quot; data-origin-width=&quot;412&quot; data-origin-height=&quot;372&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bvAWlr/btsKS9FyHC3/XNSfqG7lLx0c6dtzrZJbBk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bvAWlr/btsKS9FyHC3/XNSfqG7lLx0c6dtzrZJbBk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bvAWlr/btsKS9FyHC3/XNSfqG7lLx0c6dtzrZJbBk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbvAWlr%2FbtsKS9FyHC3%2FXNSfqG7lLx0c6dtzrZJbBk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;350&quot; height=&quot;316&quot; data-filename=&quot;스크린샷 2024-11-24 오후 3.31.10.png&quot; data-origin-width=&quot;412&quot; data-origin-height=&quot;372&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이렇게 테이블의 이름을 설정할 수도 있지만 JPA은 테이블의 정보를 더욱 세밀하게 지정할 수 있는 @Table 어노테이션을 지원한다. 이어서 이에 대해 알아보자.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;@Table 어노테이션 사용해 테이블 정보 설정하기&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;@Table 어노테이션을 사용하면 테이블의 이름과, 어떤 필드에 인덱싱을 할지를 설정할 수 있다. 예를 들어 단어를 저장하는 테이블의 이름은 VocaTable이라 지정하고, word 컬럼에 인덱싱을 하고 싶다고 해보자. 그러면 다음과 같이 @Table 어노테이션을 설정하면 된다.&lt;/p&gt;
&lt;pre id=&quot;code_1732430209734&quot; class=&quot;kotlin&quot; data-ke-language=&quot;kotlin&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;@Entity
@Table(name = &quot;VocaTable&quot;, indexes = [Index(name = &quot;idx_word&quot;, columnList = &quot;word&quot;)])
data class Vocabulary(
    @Id
    val id: String = UUID.randomUUID().toString(),
    val word: String,
    val meaning: String
)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;그러면 다음과 같이 VOCA_TABLE이라는 이름을 가진 테이블이 생성되고, IDX_WORD라 불리는 WORD를 인덱싱한 인덱스가 생성되는 것을 볼 수 있다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2024-11-24 오후 3.38.16.png&quot; data-origin-width=&quot;396&quot; data-origin-height=&quot;432&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/4Sd8P/btsKTZoy0Xd/sqo7t294dgGoiRC6UXNOJ1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/4Sd8P/btsKTZoy0Xd/sqo7t294dgGoiRC6UXNOJ1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/4Sd8P/btsKTZoy0Xd/sqo7t294dgGoiRC6UXNOJ1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F4Sd8P%2FbtsKTZoy0Xd%2Fsqo7t294dgGoiRC6UXNOJ1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;300&quot; height=&quot;327&quot; data-filename=&quot;스크린샷 2024-11-24 오후 3.38.16.png&quot; data-origin-width=&quot;396&quot; data-origin-height=&quot;432&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 외에도 schema, catalog, uniqueConstraints 같은 프로퍼티를 이 @Table 어노테이션을 사용해 설정할 수 있다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;지금까지 우리는 테이블의 속성을 설정하는 방법을 아아봤다. 이번에는 @Column 어노테이션 사용해 컬럼의 속성을 설정하는 방법을 알아보자.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;@Column 어노테이션 사용해 컬럼의 속성 설정하기&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;@Column 어노테이션을 사용하면 컬럼의 속성을 설정할 수 있다. @Column 어노테이션을 통해서는 다음 속성들을 설정할 수 있다.&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;name: 컬럼의 이름을 설정하는데 사용. 설정하지 않으면 필드의 이름이 컬럼의 이름으로 설정됨.&lt;/li&gt;
&lt;li&gt;unique: 현재 필드에 UNIQUE 제약을 걸지 여부를 결정. 기본 값은 false.&lt;/li&gt;
&lt;li&gt;nullable: 현재 필드가 NULL이 될 수 있는지 설정. 기본 값은 true.&lt;/li&gt;
&lt;li&gt;insertable: 엔티티 저장 시 해당 필드도 함께 저장할지 여부를 결정. 기본값은 true로 설정됨.&lt;/li&gt;
&lt;li&gt;updatable: 엔티티 수정 시 해당 필드도 함께 수정될지 여부를 결정. 기본값은 true로 설정됨.&lt;/li&gt;
&lt;li&gt;columnDefinition: 컬럼 정보를 직접 설정할 때 사용.&lt;/li&gt;
&lt;li&gt;table: 하나의 엔티티가 두 개 이상의 테이블에 매핑돼야 할 때 사용&lt;/li&gt;
&lt;li&gt;length: 컬럼의 최대 길이 설정. 기본 값은 255.&lt;/li&gt;
&lt;li&gt;precision: 소수점을 포함한 전체 자릿수 지정. 기본 값은 19.&lt;/li&gt;
&lt;li&gt;scale: 소수점 이하의 자리수 지정. 기본 값은 2.&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;예를 들어 MEANING 컬럼의 이름을 MEAN으로 지정하고 싶다면 다음과 같이 name=&quot;mean&quot;을 사용하면 된다.&lt;/p&gt;
&lt;pre id=&quot;code_1732430813892&quot; class=&quot;kotlin&quot; data-ke-language=&quot;kotlin&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;@Entity
data class Vocabulary(
    @Id
    val id: String = UUID.randomUUID().toString(),
    val word: String,
    @Column(name = &quot;mean&quot;) // Column명 지정도 가능
    val meaning: String
)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그러면 다음과 같이 meaning 필드의 컬럼명이 MEAN이 되는 것을 볼 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2024-11-24 오후 3.54.21.png&quot; data-origin-width=&quot;402&quot; data-origin-height=&quot;356&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cRXmaJ/btsKUgRrzHe/OppQcQkzQsrOPGbKPLFg61/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cRXmaJ/btsKUgRrzHe/OppQcQkzQsrOPGbKPLFg61/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cRXmaJ/btsKUgRrzHe/OppQcQkzQsrOPGbKPLFg61/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcRXmaJ%2FbtsKUgRrzHe%2FOppQcQkzQsrOPGbKPLFg61%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;300&quot; height=&quot;266&quot; data-filename=&quot;스크린샷 2024-11-24 오후 3.54.21.png&quot; data-origin-width=&quot;402&quot; data-origin-height=&quot;356&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;전체 코드:&amp;nbsp;&lt;a href=&quot;https://github.com/seyoungcho2/LearnSpringKotlin/tree/main/database/db-jpa&quot;&gt;GitHub&lt;/a&gt;&lt;br /&gt;이 프로젝트가 도움이 되셨다면 &lt;a href=&quot;https://github.com/seyoungcho2/LearnSpringKotlin&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;저장소&lt;/a&gt;에 Star⭐️를 눌러주세요! &lt;a href=&quot;https://github.com/seyoungcho2/LearnSpringKotlin/stargazers&quot;&gt;Stargazers&lt;/a&gt;는 다음 페이지에서 확인할 수 있습니다.&lt;/blockquote&gt;</description>
      <category>Spring/Database</category>
      <category>@Column</category>
      <category>@Entity</category>
      <category>@Id</category>
      <category>@Table</category>
      <category>JPA</category>
      <category>Kotlin</category>
      <category>kotlin spring</category>
      <category>Spring boot</category>
      <category>spring boot data jpa</category>
      <category>table</category>
      <author>Dev.Cho</author>
      <guid isPermaLink="true">https://kotlinworld.tistory.com/593</guid>
      <comments>https://kotlinworld.tistory.com/593#entry593comment</comments>
      <pubDate>Tue, 3 Dec 2024 07:55:27 +0900</pubDate>
    </item>
    <item>
      <title>[Kotlin Spring] Spring Data JPA 와 H2 Database 사용 설정하는 방법 알아보기</title>
      <link>https://kotlinworld.tistory.com/592</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;H2 Database란?&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;H2 Database는 가볍고 편리한 인 메모리 데이터 베이스로 프로그램 구동 시 메모리에 데이터를 저장하고, 애플리케이션이 종료되면 메모리가 삭제되는 데이터베이스이다. 이는 일반적으로 테스트 환경 혹은 Dev 환경 등 데이터에 대한 영속성이 요구되지 않는 환경에서 데이터를 저장하는데 사용한다. 브라우저 기반의 콘솔 프로그램 또한 제공해, 어떤 데이터가 저장되었고 삭제되었는지를 편하게 확인할 수 있다.&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;  영속성이란 프로그램이 종료돼도 데이터가 사라지지 않는 특성을 뜻한다.&amp;nbsp;&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이번 시간에는 Spring Data JPA를 사용해 H2 Database를 사용 설정하는 방법을 알아볼 것이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;코틀린 스프링 프로젝트에 Spring Data JPA, H2 Database 사용 설정하기&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;plugin.jpa 플러그인 사용 설정하기&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;일반적으로 스프링에서 JPA를 사용한다고 하면, 구현체인 Hibernate를 사용한다. 이 Hibernate는 ORM 라이브러리로써 특정 객체를 테이블에 매핑 시키기 위해 @Entity 라는 어노테이션을 사용하는데, Hibernate의 사용자 가이드에서는 이 @Entity라는 어노테이션이 붙은 클래스는 매개변수가 없으면서 가시성이 public 혹은 protected로 설정된 생성자가 있어야 한다고 명시한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;하지만, 코틀린에서 프로퍼티가 정의된 클래스는 일반적으로 기본 생성자를 자신이 가진 프로퍼티를 매개변수로 갖는 생성자를 자동으로 생성한다. 이로 인해 Hibernate의 요구사항과 충돌이 발생할 수 있으며, 이를 해결하기 위해서는 다음과 같이 별도의 생성자를 정의하고 이 생성자를 호출할 때는 기본 값들을 사용해 객체가 생성될 수 있도록 해야 한다.&lt;/p&gt;
&lt;pre id=&quot;code_1732411376566&quot; class=&quot;kotlin&quot; data-ke-language=&quot;kotlin&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;@Entity
class User(
    @Id val id: Long? = null,
    val name: String
) {
    constructor() : this(null, &quot;&quot;)
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;하지만, 매번 Entity를 정의할 때마다 이런 매개변수가 없는 생성자를 만드는 것은 보일러 플레이트 코드가 되고, 코드의 가독성을 떨어트릴 수 있다. 이 문제를 해결하기 위해 코틀린에서는 plugin.jpa라는 플러그인을 제공한다. 이 플러그인을 사용하면, 클래스를 아래와 같이 같이 작성해도 컴파일 타임에 자동으로 매개변수가 없는 생성자를 만들어준다.&lt;/p&gt;
&lt;pre id=&quot;code_1732411618888&quot; class=&quot;kotlin&quot; data-ke-language=&quot;kotlin&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;@Entity
class User(
    @Id val id: Long? = null,
    val name: String
)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;plugin.jpa 플러그인을 적용하는 방법은 간단하다. 단순히 build.gradle.kts 파일에 다음과 같이 plugin.jpa 플러그인을 추가하면 된다.&amp;nbsp;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1732410373433&quot; class=&quot;kotlin&quot; data-ke-language=&quot;kotlin&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;plugins {
    // JPA 플러그인 설정
    kotlin(&quot;plugin.jpa&quot;) version &quot;1.9.25&quot;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이제 플러그인 설정이 마무리 됐으니, 의존성 설정을 진행해보자.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Spring Data JPA, H2 Database 의존성 설정하기&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Spring Data JPA를 사용하기 위해서는 두가지 의존성을 설정해야 한다. 하나는 Spring Boot 프로젝트에서 JDBC(Java Database Connectivity)를 더 쉽고 효율적으로 사용할 수 있도록 도와주는 스타터 패키지인 spring-boot-starter-data-jdbc 라이브러리에 대한 의존성을 추가하는 것이고, 다른 하나는 Spring&amp;nbsp;Boot&amp;nbsp;프로젝트에서&amp;nbsp;JPA(Java&amp;nbsp;Persistence&amp;nbsp;API)를&amp;nbsp;쉽고&amp;nbsp;효율적으로&amp;nbsp;사용할&amp;nbsp;수&amp;nbsp;있도록&amp;nbsp;도와주는&amp;nbsp;스타터&amp;nbsp;패키지인 spring-boot-starter-data-jpa에 대한 의존성을 추가하는 것이다. 이들 각각에 대한 의존성은 implementation 함수를 통해 설정한다.&lt;/p&gt;
&lt;pre id=&quot;code_1732412157974&quot; class=&quot;kotlin&quot; data-ke-language=&quot;kotlin&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;dependencies {
    // Spring Data JDBC 의존성 설정 
    implementation(&quot;org.springframework.boot:spring-boot-starter-data-jdbc&quot;)
    
    // Spring Data JPA 의존성 설정
    implementation(&quot;org.springframework.boot:spring-boot-starter-data-jpa&quot;)
    ...
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이제 H2 Database에 대한 설정만 남았다. H2 Database는 런타임에 실행되는 인메모리 데이터 베이스 이므로, runtimeOnly 함수를 통해 com.h2database:h2 를 사용하도록 하면 된다.&lt;/p&gt;
&lt;pre id=&quot;code_1732410245008&quot; class=&quot;kotlin&quot; data-ke-language=&quot;kotlin&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;dependencies {
    // Spring Data JDBC 의존성 설정 
    implementation(&quot;org.springframework.boot:spring-boot-starter-data-jdbc&quot;)
    
    // Spring Data JPA 의존성 설정
    implementation(&quot;org.springframework.boot:spring-boot-starter-data-jpa&quot;)
    
    // H2 Database 사용 설정
    runtimeOnly(&quot;com.h2database:h2&quot;)
    ...
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이렇게 설정하면 모든 의존성 설정이 마무리 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이제 마지막 한 단계가 남았다. 나머지 한 단계도 마저 마무리 해보자.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;@Entity, @Embeddable, @MappedSuperclass가 붙은 클래스들이 상속 가능하게 만들기&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;자바에서는 기본적으로 클래스가 상속 가능하게 설정되는 반면, 코틀린에서 클래스는 기본적으로 final로 선언돼 상속이 불가능하며, 상속 가능하게 만들기 위해서는 다음과 같이 open 이라는 키워드가 앞에 붙어야 한다.&lt;/p&gt;
&lt;pre id=&quot;code_1732412498458&quot; class=&quot;kotlin&quot; data-ke-language=&quot;kotlin&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;@Entity
open class User(
    @Id val id: Long? = null,
    val name: String
)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;하지만, Hibernate를 사용할 때는 @Entity, @Embeddable, @MappedSuperclass 가 붙은 클래스들은 상속 가능하도록 되어야 한다. 이를 위해 build.gradle.kts 파일에 다음과 같은 설정을 추가로 해주면 @Entity, @Embeddable, @MappedSuperclass 어노테이션이 붙은 클래스들이 상속 가능해진다.&lt;/p&gt;
&lt;pre id=&quot;code_1732412704997&quot; class=&quot;kotlin&quot; data-ke-language=&quot;kotlin&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;allOpen {
    annotation(&quot;jakarta.persistence.Entity&quot;)
    annotation(&quot;jakarta.persistence.MappedSuperclass&quot;)
    annotation(&quot;jakarta.persistence.Embeddable&quot;)
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;*allOpen 블록은 Kotlin의 kotlin-allopen 플러그인을 사용하여 특정 애노테이션이 붙은 클래스들을 자동으로 open으로 만드는 데 사용되는 블록이다.&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이제 build.gradle.kts에서는 모든 준비가 마쳐졌다. 전체 코드는 다음 링크에서 확인할 수 있다.&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;전체 코드:&amp;nbsp;&lt;a href=&quot;https://github.com/seyoungcho2/LearnSpringKotlin/blob/main/database/db-jpa/build.gradle.kts&quot;&gt;build.gradle.kts - GitHub&lt;/a&gt;&lt;br /&gt;이 프로젝트가 도움이 되셨다면 &lt;a href=&quot;https://github.com/seyoungcho2/LearnSpringKotlin&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;저장소&lt;/a&gt;에 Star⭐️를 눌러주세요! &lt;a href=&quot;https://github.com/seyoungcho2/LearnSpringKotlin/stargazers&quot;&gt;Stargazers&lt;/a&gt;는 다음 페이지에서 확인할 수 있습니다.&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다음으로는 H2 Database관련 설정을 application.properties에 추가해보자.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;application.properties에 H2 Database 설정하기&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;H2 Database 연결 설정하기&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;H2 Database 연결을 설정하기 위해서는 다음 네가지를 설정해줘야 한다.&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;spring.datasource.url: 어떤 url을 통해 db에 접근이 가능한지&lt;/li&gt;
&lt;li&gt;spring.datasource.driverClassName:어떤 드라이버를 사용할 것인지&lt;/li&gt;
&lt;li&gt;spring.datasource.username: DB 유저 이름&lt;/li&gt;
&lt;li&gt;spring.datasource.password: DB 유저 비밀번호&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;예를 들어 jdbc:h2:mem:testdb 를 통해 db에 접근하면서 org.h2.Driver 드라이버를 사용하고, 사용자 이름은 user&amp;nbsp;비밀번호는 password으로 설정하고 싶다면 다음과 같이 설정해주면 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1732413078822&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;spring.datasource.url=jdbc:h2:mem:testdb
spring.datasource.driverClassName=org.h2.Driver
spring.datasource.username=dummyuser
spring.datasource.password=password&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그러면 연결과 관련된 설정이 마무리되었다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;H2 Database 콘솔 설정하기&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이제 H2 Database 용 콘솔을 사용할 수 있도록 설정해보자. spring.h2.console.enabled의 값을 true로 두면 콘솔이 활성화되고, spring.h2.console.path를 /h2-console로 설정하면 /h2-console 경로를 통해 콘솔 창에 접근할 수 있게 된다.&lt;/p&gt;
&lt;pre id=&quot;code_1732413362993&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;spring.h2.console.enabled=true
spring.h2.console.path=/h2-console&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;여기까지 모든 준비가 마무리됐다. 전체 코드는 다음 링크에서 확인할 수 있다.&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;전체 코드: &lt;a href=&quot;https://github.com/seyoungcho2/LearnSpringKotlin/blob/main/database/db-jpa/src/main/resources/application.properties&quot;&gt;application.properties-GitHub&lt;/a&gt;&lt;br /&gt;이 프로젝트가 도움이 되셨다면 &lt;a href=&quot;https://github.com/seyoungcho2/LearnSpringKotlin&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;저장소&lt;/a&gt;에 Star⭐️를 눌러주세요! &lt;a href=&quot;https://github.com/seyoungcho2/LearnSpringKotlin/stargazers&quot;&gt;Stargazers&lt;/a&gt;는 다음 페이지에서 확인할 수 있습니다.&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이제 스프링 애플리케이션을 실행하고, 콘솔에 접근해보자.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;H2 Database 콘솔 사용하기&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;http://localhost:8080/h2-console 로 접근하면 다음과 같은 화면이 나온다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;920&quot; data-origin-height=&quot;896&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/IBUmO/btsKTAv7c8w/bGjdXAXHT6QH3xK8D2jgYk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/IBUmO/btsKTAv7c8w/bGjdXAXHT6QH3xK8D2jgYk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/IBUmO/btsKTAv7c8w/bGjdXAXHT6QH3xK8D2jgYk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FIBUmO%2FbtsKTAv7c8w%2FbGjdXAXHT6QH3xK8D2jgYk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;500&quot; height=&quot;487&quot; data-origin-width=&quot;920&quot; data-origin-height=&quot;896&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;화면에 위의 application.properties에 설정한 데이터를 적은 후 Connect를 눌러주면 다음과 같이 콘솔 창이 나오는 것을 볼 수 있다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2024-11-24 오전 11.07.25.png&quot; data-origin-width=&quot;1500&quot; data-origin-height=&quot;1060&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bjNqqB/btsKTrlAavH/FUgniOE4W3KjMGH9LIM1tk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bjNqqB/btsKTrlAavH/FUgniOE4W3KjMGH9LIM1tk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bjNqqB/btsKTrlAavH/FUgniOE4W3KjMGH9LIM1tk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbjNqqB%2FbtsKTrlAavH%2FFUgniOE4W3KjMGH9LIM1tk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;700&quot; height=&quot;495&quot; data-filename=&quot;스크린샷 2024-11-24 오전 11.07.25.png&quot; data-origin-width=&quot;1500&quot; data-origin-height=&quot;1060&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;여기까지 모든 설정이 마무리됐다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이어서 H2 Database 내부에 테이블을 만드는 방법을 알아보자.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;전체 코드:&amp;nbsp;&lt;a href=&quot;https://github.com/seyoungcho2/LearnSpringKotlin/tree/main/database/db-jpa&quot;&gt;GitHub&lt;/a&gt;&lt;br /&gt;이 프로젝트가 도움이 되셨다면 &lt;a href=&quot;https://github.com/seyoungcho2/LearnSpringKotlin&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;저장소&lt;/a&gt;에 Star⭐️를 눌러주세요! &lt;a href=&quot;https://github.com/seyoungcho2/LearnSpringKotlin/stargazers&quot;&gt;Stargazers&lt;/a&gt;는 다음 페이지에서 확인할 수 있습니다.&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>Spring/Database</category>
      <category>com.h2database:h2</category>
      <category>H2 database</category>
      <category>Kotlin</category>
      <category>Spring boot</category>
      <category>Spring Data JPA</category>
      <category>spring-boot-starter-data-jdbc</category>
      <category>spring-boot-starter-data-jpa</category>
      <category>스프링</category>
      <category>코틀린</category>
      <category>코프링</category>
      <author>Dev.Cho</author>
      <guid isPermaLink="true">https://kotlinworld.tistory.com/592</guid>
      <comments>https://kotlinworld.tistory.com/592#entry592comment</comments>
      <pubDate>Mon, 2 Dec 2024 07:09:15 +0900</pubDate>
    </item>
    <item>
      <title>[Spring] WAR와 JAR 파일의 차이 한 번에 정리하기</title>
      <link>https://kotlinworld.tistory.com/585</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;WAR 파일을 통해 배포하기&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;WAR 파일을 배포하기 위해서는 다음 과정을 거쳐야 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1326&quot; data-origin-height=&quot;336&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/RsmND/btsKDP77Xzv/PuXeyfJaN6OjaWK2kY5361/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/RsmND/btsKDP77Xzv/PuXeyfJaN6OjaWK2kY5361/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/RsmND/btsKDP77Xzv/PuXeyfJaN6OjaWK2kY5361/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FRsmND%2FbtsKDP77Xzv%2FPuXeyfJaN6OjaWK2kY5361%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;750&quot; height=&quot;190&quot; data-origin-width=&quot;1326&quot; data-origin-height=&quot;336&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. JDK 혹은 JRE 설치&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. Web Server 설치&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3. WAR 파일 배포&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;WAR 파일을 배포하기 위해서는 JRE와 Web Server가 있어야 한다. 따라서 우선 JDK나 JRE을 설치 한 후&amp;nbsp; Web Server을 설치하고 해당 WebServer에 WAR파일을 배포하면 된다. 예를 들어 Tomcat을 사용하는 경우 WAR파일을 webapps 디렉토리에 복사하거나, Tomcat Manager을 사용해 WAR 파일을 직접 선택해 배포해야 할 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;익숙하다면 복잡하지 않을 수 있지만, 만약 이 Web Server을 배포를 위한 파일에 함께 내장할 수 있다면 배포 과정이 더욱 간단해질 수 있을 것이다. 이러한 역할을 하기 위해 JAR 파일이 등장한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;JAR 파일을 통해 배포하기&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;JAR 파일에는 Web Server(Tomcat 등)가 내장되어 있다. 따라서 별도로 WebServer을 설치할 필요가 없으며, 배포를 위해 JRE만 필요하다. 따라서 JDK나 JRE를 설치한 후, 단순히 아래 명령어를 실행하면 배포가 완료된다.&lt;/p&gt;
&lt;pre id=&quot;code_1731291120901&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;java -jar 파일명.jar&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;즉 과정이 다음 그림과 같이 두 단계로 단순화된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;962&quot; data-origin-height=&quot;334&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bvgsS5/btsKEj8MVDw/K2HKSNXYmIZbstgGCZQzwk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bvgsS5/btsKEj8MVDw/K2HKSNXYmIZbstgGCZQzwk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bvgsS5/btsKEj8MVDw/K2HKSNXYmIZbstgGCZQzwk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbvgsS5%2FbtsKEj8MVDw%2FK2HKSNXYmIZbstgGCZQzwk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;600&quot; height=&quot;208&quot; data-origin-width=&quot;962&quot; data-origin-height=&quot;334&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이런 장점 때문에 최근에는 WAR 파일을 사용하지 않고 JAR 파일을 주로 사용한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>Spring/Settings</category>
      <category>.jar</category>
      <category>.war</category>
      <category>deploy</category>
      <category>jar</category>
      <category>Spring</category>
      <category>War</category>
      <category>배포</category>
      <category>스프링</category>
      <author>Dev.Cho</author>
      <guid isPermaLink="true">https://kotlinworld.tistory.com/585</guid>
      <comments>https://kotlinworld.tistory.com/585#entry585comment</comments>
      <pubDate>Sun, 1 Dec 2024 07:40:49 +0900</pubDate>
    </item>
    <item>
      <title>[Spring Boot] Actuator 사용해 애플리케이션 모니터링하기</title>
      <link>https://kotlinworld.tistory.com/590</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;Actuator란 무엇인가?&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Actuator란 Spring Boot에서 제공하는 애플리케이션 모니터링 및 관리 기능으로, Spring 애플리케이션의 Health를 체크하거나, Bean 목록을 확인하거나, 각 패키지의 로그 레벨이 어떻게 설정돼 있는지 확인하거나, Heap Dump를 제공하는 등 수십가지 기능을 제공하는  모니터링 툴이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;Actuator 사용하기&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Actuator을 사용하는 방법은 매우 간단하다. 단순히 build.gradle.kts 파일에 spring-boot-starter-actuator에 대한 의존성을 추가하면 된다. 그러면, Actuator 관련 기능이 활성화 된다.&lt;/p&gt;
&lt;pre id=&quot;code_1731772599279&quot; class=&quot;kotlin&quot; data-ke-language=&quot;kotlin&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;dependencies {
    implementation(&quot;org.springframework.boot:spring-boot-starter-actuator&quot;)
    ...
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이것을 추가하고, 애플리케이션을 실행해보자. 이후 localhost:8080/actuator 에 접속하면 다음과 같은 화면이 나온다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2024-11-17 오전 12.57.59.png&quot; data-origin-width=&quot;986&quot; data-origin-height=&quot;648&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/kEWxi/btsKMfSckci/PxGvrQIbqig4oBK3CT928K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/kEWxi/btsKMfSckci/PxGvrQIbqig4oBK3CT928K/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/kEWxi/btsKMfSckci/PxGvrQIbqig4oBK3CT928K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FkEWxi%2FbtsKMfSckci%2FPxGvrQIbqig4oBK3CT928K%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;500&quot; height=&quot;329&quot; data-filename=&quot;스크린샷 2024-11-17 오전 12.57.59.png&quot; data-origin-width=&quot;986&quot; data-origin-height=&quot;648&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;여기서 &quot;health&quot;, &quot;health-path&quot;는 Actuator에서 제공하는 기능이며, href로 표현된 링크로 이동하면 해당 기능을 사용할 수 있다. 예를 들어 health를 확인하기 위해서는 http://localhost:8080/actuator/health로 이동하면 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그러면 다음과 같이 &quot;status&quot;: &quot;UP&quot; 이라는 문구가 나오고, 이는 서버가 살아있다 라는 뜻이다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2024-11-17 오전 12.59.38.png&quot; data-origin-width=&quot;740&quot; data-origin-height=&quot;262&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bspzok/btsKLmxAMpX/MAv2kzlp9ydbvzVz4HUYIK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bspzok/btsKLmxAMpX/MAv2kzlp9ydbvzVz4HUYIK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bspzok/btsKLmxAMpX/MAv2kzlp9ydbvzVz4HUYIK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbspzok%2FbtsKLmxAMpX%2FMAv2kzlp9ydbvzVz4HUYIK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;450&quot; height=&quot;159&quot; data-filename=&quot;스크린샷 2024-11-17 오전 12.59.38.png&quot; data-origin-width=&quot;740&quot; data-origin-height=&quot;262&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;하지만, 서버가 살아있다 정도로는 정보가 충분하지 않으므로, 더 자세한 정보를 보는 방법을 알아보자.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Spring Actuator은 여러 지표를 수집할 수 있지만, 별도 옵션을 적용하지 않으면 기본적으로 최소한의 정보만을 수집한다. 더욱 많은 정보를 수집할 수록 애플리케이션에 부담이 가고, 심하게는 보안 문제가 생길 수 있기 때문이다. 따라서 필요한 경우 정보를 수집하기 위한 옵션을 application.properties 파일에 별도로 정의해줘야 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;health와 관련된 더 자세한 정보를 수집하기 위해서는 application.properties 파일에 다음과 같은 옵션을 추가하면 된다.&lt;/p&gt;
&lt;pre id=&quot;code_1731773030230&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;management.endpoint.health.show-details=always&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그런 후 애플리케이션을 다시 실행하고 http://localhost:8080/actuator/health 를 확인하면 다음과 같이 더욱 자세한 정보가 나오는 것을 볼 수 있게 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2024-11-17 오전 1.07.43.png&quot; data-origin-width=&quot;1080&quot; data-origin-height=&quot;700&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dDeDVN/btsKKEFJZld/k367LowZUOgMS6wJafZDW1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dDeDVN/btsKKEFJZld/k367LowZUOgMS6wJafZDW1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dDeDVN/btsKKEFJZld/k367LowZUOgMS6wJafZDW1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdDeDVN%2FbtsKKEFJZld%2Fk367LowZUOgMS6wJafZDW1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;500&quot; height=&quot;324&quot; data-filename=&quot;스크린샷 2024-11-17 오전 1.07.43.png&quot; data-origin-width=&quot;1080&quot; data-origin-height=&quot;700&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;Actuator의 다른 기능들 살펴보기&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;앞서 Actuator에는 수십가지 기능이 있다고 했는데, 이곳에는 한 가지 기능밖에 없었다. Actuator의 다른 기능들을 살펴보기 위해서는 필요한  application.properties 파일에 보이도록 설정해야 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;예를 들어 생성된 bean 정보(beans), 패키지별 로그 레벨 정보(loggers), 지표 정보(metric) 를 확인하기 위해서는 다음과 같은 옵션을 application.properties에 추가하면 된다.&lt;/p&gt;
&lt;pre id=&quot;code_1731773425060&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;management.endpoints.web.exposure.include=beans,loggers,metrics&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그러면 다시 /actuator 경로로 접근했을 때 다음과 같이 bean&amp;nbsp;정보(beans),&amp;nbsp;패키지별&amp;nbsp;로그&amp;nbsp;레벨&amp;nbsp;정보(loggers),&amp;nbsp;지표&amp;nbsp;정보(metric)이 추가로 나오게 된다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2024-11-17 오전 1.12.09.png&quot; data-origin-width=&quot;1204&quot; data-origin-height=&quot;970&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Bghv4/btsKMg4Cwsb/zF1cagOxZKf7QWHHCsfdaK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Bghv4/btsKMg4Cwsb/zF1cagOxZKf7QWHHCsfdaK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Bghv4/btsKMg4Cwsb/zF1cagOxZKf7QWHHCsfdaK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FBghv4%2FbtsKMg4Cwsb%2FzF1cagOxZKf7QWHHCsfdaK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;500&quot; height=&quot;403&quot; data-filename=&quot;스크린샷 2024-11-17 오전 1.12.09.png&quot; data-origin-width=&quot;1204&quot; data-origin-height=&quot;970&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;여기서 http://localhost:8080/actuator/loggers로 들어가 보면 다음과 같이 각 패키지별로 로그 레벨이 어떻게 설정돼 있는지 볼 수 있다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2024-11-17 오전 1.13.08.png&quot; data-origin-width=&quot;1032&quot; data-origin-height=&quot;1118&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/YzNeP/btsKNqrG4HT/uE8rZhpfHBh4kFzS6zWVW1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/YzNeP/btsKNqrG4HT/uE8rZhpfHBh4kFzS6zWVW1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/YzNeP/btsKNqrG4HT/uE8rZhpfHBh4kFzS6zWVW1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FYzNeP%2FbtsKNqrG4HT%2FuE8rZhpfHBh4kFzS6zWVW1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;500&quot; height=&quot;542&quot; data-filename=&quot;스크린샷 2024-11-17 오전 1.13.08.png&quot; data-origin-width=&quot;1032&quot; data-origin-height=&quot;1118&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;Actuator의 모든 기능 노출하는 방법과 주의점&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Actuator의 모든 기능을 살펴보기 위해서는 application.properties 파일에 management.endpoints.web.exposure.include=* 옵션을 추가하면 된다.&lt;/p&gt;
&lt;pre id=&quot;code_1731773390728&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;management.endpoints.web.exposure.include=*&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;하지만, 위 옵션을 실제 서비스 되는 애플리케이션에 적용하는 것은 권장되지 않는다. 성능 상에도 문제가 있고 무엇보다 노출되면 안되는 Key가 노출돼 보안 문제가 생길 수 있기 때문이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;즉, Actuator을 사용할 때는 모든 기능을 차단해두고 필요한 기능만을 추가하는 화이트리스트 방식으로 해야 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;전체 코드:&amp;nbsp;&lt;a href=&quot;https://github.com/seyoungcho2/LearnSpringKotlin/tree/main/settings/setting-actuator&quot;&gt;GitHub&lt;/a&gt;&lt;br /&gt;이 프로젝트가 도움이 되셨다면 &lt;a href=&quot;https://github.com/seyoungcho2/LearnSpringKotlin&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;저장소&lt;/a&gt;에 Star⭐️를 눌러주세요! &lt;a href=&quot;https://github.com/seyoungcho2/LearnSpringKotlin/stargazers&quot;&gt;Stargazers&lt;/a&gt;는 다음 페이지에서 확인할 수 있습니다.&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>Spring/Settings</category>
      <category>actuator</category>
      <category>Spring</category>
      <category>Spring boot</category>
      <category>모니터링</category>
      <category>스프링</category>
      <category>스프링부트</category>
      <category>코프링</category>
      <author>Dev.Cho</author>
      <guid isPermaLink="true">https://kotlinworld.tistory.com/590</guid>
      <comments>https://kotlinworld.tistory.com/590#entry590comment</comments>
      <pubDate>Sat, 30 Nov 2024 07:17:37 +0900</pubDate>
    </item>
    <item>
      <title>[Spring Boot] @ConfigurationProperties 사용해 application.properties에 정의된 값을 Bean으로 주입 받기</title>
      <link>https://kotlinworld.tistory.com/589</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;@ConfigurationProperties 가 필요한 경우&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;application.properties 파일에는 애플리케이션을 위한 여러 설정이 들어간다. 이때 여러 설정 값들을 application.properties에 정의해 놓는데, 이 값들을 앱으로 가져와야 하는 경우가 생긴다. 예를 들어 서버의 이름, &lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;서버에서 허용하는 클라이언트의 유형&lt;/span&gt;&amp;nbsp;등을 개발 환경 별로 다르게 설정해놓고 이 값을 통해 애플리케이션을 설정하는 경우 등이 있을 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;예를 들어 다음과 같은 application.properties 파일이 있다고 해보자.&lt;/p&gt;
&lt;pre id=&quot;code_1731771133766&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;spring.application.name=setting-configurationproperties

server.server-name=release
server.allowed-clients[0]=Android
server.allowed-clients[1]=iOS&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이런 경우 server.server-name, server.allowed-client 를 코드에서 사용하고 싶다면 @ConfigurationProperties 를 사용하면 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;@ConfigurationProperties 사용해 값을 담는 Bean 만들기&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;@ConfigurationProperties를 사용하는 방법은 간단하다. 단순히 server.server-name와 server.allowed-client의 prefix가 server 이므로, @ConfigurationProperties의 prefix인자로 server를 넘긴 후, 그 다음에 나오는 server-name과 allowed-client는 camel case로 변경해 serverName, allowedClient로 만들어 프로퍼티로 넣으면 된다.&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1731771116522&quot; class=&quot;kotlin&quot; data-ke-language=&quot;kotlin&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;@ConfigurationProperties(prefix = &quot;server&quot;)
data class ServerConfiguration(
    val serverName: String,
    val allowedClients: List&amp;lt;String&amp;gt;
)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이후 이 ConfigurationProperties를 만드는 것을 허용하기 위해 @EnableConfigurationProperties(ServerConfiguration::class) 어노테이션을 SpringBootApplication과 함께 붙여 넣으면 된다.&lt;/p&gt;
&lt;div style=&quot;background-color: #1e1f22; color: #bcbec4;&quot;&gt;
&lt;pre class=&quot;less&quot;&gt;&lt;code&gt;@SpringBootApplication
@EnableConfigurationProperties(ServerConfiguration::class)
class SettingConfigurationpropertiesApplication&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그러면 ServerConfiguration은 Bean으로 등록되고, 어디에서든 사용할 수 있게 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Bean이 제대로 만들어졌는지 확인하기 위해 다음과 같이 간단한 컨트롤러를 만들어보자.&lt;/p&gt;
&lt;pre id=&quot;code_1731771198407&quot; class=&quot;kotlin&quot; data-ke-language=&quot;kotlin&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;@RestController
class ServerController(
    private val serverConfiguration: ServerConfiguration
) {
    @GetMapping(&quot;/server/config&quot;)
    fun getServerConfiguration(): ServerConfiguration {
        return serverConfiguration
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 컨트롤러는 /server/config 경로로 요청이 들어올 시 ServerConfiguration 객체를 JSON 형태로 반환하는 컨트롤러이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이제 애플리케이션을 실행한 후 localhost:8080/server/config 로 접속하면 다음과 같은 결과가 나오는 것을 볼 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2024-11-17 오전 12.34.46.png&quot; data-origin-width=&quot;722&quot; data-origin-height=&quot;442&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/rawty/btsKLfFqzg3/j1hHb6E6MLluYO5SsRJNSk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/rawty/btsKLfFqzg3/j1hHb6E6MLluYO5SsRJNSk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/rawty/btsKLfFqzg3/j1hHb6E6MLluYO5SsRJNSk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Frawty%2FbtsKLfFqzg3%2Fj1hHb6E6MLluYO5SsRJNSk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;450&quot; height=&quot;275&quot; data-filename=&quot;스크린샷 2024-11-17 오전 12.34.46.png&quot; data-origin-width=&quot;722&quot; data-origin-height=&quot;442&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;전체 코드:&amp;nbsp;&lt;a href=&quot;https://github.com/seyoungcho2/LearnSpringKotlin/tree/main/setting-configurationproperties&quot;&gt;GitHub&lt;/a&gt;&lt;br /&gt;이 프로젝트가 도움이 되셨다면 &lt;a href=&quot;https://github.com/seyoungcho2/LearnSpringKotlin&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;저장소&lt;/a&gt;에 Star⭐️를 눌러주세요! &lt;a href=&quot;https://github.com/seyoungcho2/LearnSpringKotlin/stargazers&quot;&gt;Stargazers&lt;/a&gt;는 다음 페이지에서 확인할 수 있습니다.&lt;/blockquote&gt;</description>
      <category>Spring/Settings</category>
      <category>@ConfigurationProperties</category>
      <category>@enableconfigurationproperties</category>
      <category>application.properties</category>
      <category>bean</category>
      <category>Kotlin</category>
      <category>Spring</category>
      <category>Spring boot</category>
      <category>스프링부트</category>
      <category>코프링</category>
      <author>Dev.Cho</author>
      <guid isPermaLink="true">https://kotlinworld.tistory.com/589</guid>
      <comments>https://kotlinworld.tistory.com/589#entry589comment</comments>
      <pubDate>Fri, 29 Nov 2024 07:38:12 +0900</pubDate>
    </item>
    <item>
      <title>[Spring Boot] DevTools로 개발 생산성 높이기 1편: Live Reload 완벽 가이드</title>
      <link>https://kotlinworld.tistory.com/588</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;Live Reload란?&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;스프링 부트로 스프링 애플리케이션을 개발하면서 코드에 변경 사항이 발생하면, 애플리케이션을 중지한 후 다시 실행해야 변경 사항을 확인할 수 있다. 하지만, 매번 이 과정을 거치는 것은 번거롭다. 이 문제를 해결하기 위해 Spring Boot는 DevTools 모듈을 통해 Live Reload라는 기능을 제공해 이 과정을 자동으로 할 수 있게 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;DevTools 의존성 추가하기&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이런 기능을 사용하기 위해서는 DevTools 모듈을 추가해야 한다. build.gradle.kts 파일의 dependencies 블록에 다음과 같은 의존성을 설정한다.&lt;/p&gt;
&lt;div style=&quot;background-color: #1e1f22; color: #bcbec4;&quot;&gt;
&lt;pre class=&quot;kotlin&quot; data-ke-language=&quot;kotlin&quot;&gt;&lt;code&gt;dependencies {
    developmentOnly(&quot;org.springframework.boot:spring-boot-devtools&quot;)
    ...
}&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;developmentOnly는 개발 시에만 추가되는 의존성으로 이 DevTools 모듈은 개발 편의를 위한 것이기 때문에 의존성 설정 시 developmentOnly를 사용한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 의존성이 추가되면 자동으로 Live Reload 기능이 활성화된다. 이것이 제대로 동작하는지 확인해보자.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;Controller 만들기&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;먼저 Controller을 다음과 같이 만든 후 애플리케이션을 실행해보자.&lt;/p&gt;
&lt;div style=&quot;background-color: #1e1f22; color: #bcbec4;&quot;&gt;
&lt;pre class=&quot;kotlin&quot; data-ke-language=&quot;kotlin&quot;&gt;&lt;code&gt;@Controller
class Controller {
    @GetMapping(&quot;/hello&quot;)
    @ResponseBody
    fun hello(): String {
        return &quot;Hello, Kotlin World!&quot;
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그러면 /hello 경로에 대한 Get 호출 시 &quot;Hello, Kotlin World&quot; 문구가 반환된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2024-11-16 오후 9.43.12.png&quot; data-origin-width=&quot;628&quot; data-origin-height=&quot;222&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bwhxF9/btsKLfMbTZ5/oRlFxeD04neD5zBLimSYK0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bwhxF9/btsKLfMbTZ5/oRlFxeD04neD5zBLimSYK0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bwhxF9/btsKLfMbTZ5/oRlFxeD04neD5zBLimSYK0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbwhxF9%2FbtsKLfMbTZ5%2FoRlFxeD04neD5zBLimSYK0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;400&quot; height=&quot;141&quot; data-filename=&quot;스크린샷 2024-11-16 오후 9.43.12.png&quot; data-origin-width=&quot;628&quot; data-origin-height=&quot;222&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이제 Live Reload 기능이 제대로 동작하는지 확인하기 위해 위 Controller을 다음과 같이 변경 후 저장해보자.&lt;/p&gt;
&lt;div style=&quot;background-color: #1e1f22; color: #bcbec4;&quot;&gt;
&lt;pre class=&quot;kotlin&quot; data-ke-language=&quot;kotlin&quot;&gt;&lt;code&gt;@Controller
class Controller {
    @GetMapping(&quot;/hello&quot;)
    @ResponseBody
    fun hello(): String {
        return &quot;Hello, Spring Kotlin World!&quot;
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그러면 로그를 보면 &quot;[devtools][&amp;nbsp; restartedMain]&quot; 이라는 문구가 나오면서 스프링 애플리케이션이 자동으로 재시작된다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2024-11-16 오후 9.39.54.png&quot; data-origin-width=&quot;2730&quot; data-origin-height=&quot;1012&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cVKZX9/btsKKP1mN5j/zKfudG0cTOEP2JJFWHDQFK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cVKZX9/btsKKP1mN5j/zKfudG0cTOEP2JJFWHDQFK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cVKZX9/btsKKP1mN5j/zKfudG0cTOEP2JJFWHDQFK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcVKZX9%2FbtsKKP1mN5j%2FzKfudG0cTOEP2JJFWHDQFK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2730&quot; height=&quot;1012&quot; data-filename=&quot;스크린샷 2024-11-16 오후 9.39.54.png&quot; data-origin-width=&quot;2730&quot; data-origin-height=&quot;1012&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그리고 다시 /hello 경로로 접속해보면 변경된 코드가 바로 반영된 것을 볼 수 있다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2024-11-16 오후 9.41.39.png&quot; data-origin-width=&quot;658&quot; data-origin-height=&quot;238&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/U22ik/btsKME5cJly/0X4m50WoPKlyUD4PZ3GLU0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/U22ik/btsKME5cJly/0X4m50WoPKlyUD4PZ3GLU0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/U22ik/btsKME5cJly/0X4m50WoPKlyUD4PZ3GLU0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FU22ik%2FbtsKME5cJly%2F0X4m50WoPKlyUD4PZ3GLU0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;400&quot; height=&quot;145&quot; data-filename=&quot;스크린샷 2024-11-16 오후 9.41.39.png&quot; data-origin-width=&quot;658&quot; data-origin-height=&quot;238&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이처럼 Live Reload 기능을 사용하면, 코드에 변경사항이 생기면 스프링 애플리케이션이 자동으로 재시작된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;전체 코드:&amp;nbsp;&lt;a href=&quot;https://github.com/seyoungcho2/LearnSpringKotlin/tree/main/settings/devtools&quot;&gt;GitHub&lt;/a&gt;&lt;br /&gt;이 프로젝트가 도움이 되셨다면 &lt;a href=&quot;https://github.com/seyoungcho2/LearnSpringKotlin&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;저장소&lt;/a&gt;에 Star⭐️를 눌러주세요! &lt;a href=&quot;https://github.com/seyoungcho2/LearnSpringKotlin/stargazers&quot;&gt;Stargazers&lt;/a&gt;는 다음 페이지에서 확인할 수 있습니다.&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>Spring/DevTools</category>
      <category>devtools</category>
      <category>kotlin spring</category>
      <category>live reload</category>
      <category>Spring</category>
      <category>Spring boot</category>
      <category>생산성</category>
      <category>스프링</category>
      <category>스프링부트</category>
      <category>코프링</category>
      <author>Dev.Cho</author>
      <guid isPermaLink="true">https://kotlinworld.tistory.com/588</guid>
      <comments>https://kotlinworld.tistory.com/588#entry588comment</comments>
      <pubDate>Thu, 28 Nov 2024 07:46:28 +0900</pubDate>
    </item>
    <item>
      <title>[Spring Boot] 개발환경(Dev, Qa, Release) 별로 서로 다른 application.properties 파일 사용하도록 만들기</title>
      <link>https://kotlinworld.tistory.com/587</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;개발 환경 별로 서로 다른 application.properties 파일이 필요한 이유&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;application.properties는 스프링 부트 애플리케이션의 설정 파일 역할을 하며, 이곳에는 로그 레벨이나 DB 접속 정보 등 다양한 설정을 작성할 수 있다. 이 정보들은 개발 환경 별로 다르게 설정되어야 한다. &lt;span style=&quot;font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', 'Apple SD Gothic Neo', Arial, sans-serif; letter-spacing: 0px;&quot;&gt;개발 환경은 대표적으로 다음 세가지가 있다.&lt;/span&gt;&lt;span style=&quot;font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', 'Apple SD Gothic Neo', Arial, sans-serif; letter-spacing: 0px;&quot;&gt;&lt;/span&gt;&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;Dev&lt;/li&gt;
&lt;li&gt;Qa&lt;/li&gt;
&lt;li&gt;Release(혹은 Prod)&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', 'Apple SD Gothic Neo', Arial, sans-serif; letter-spacing: 0px;&quot;&gt;Dev 환경에서는 개발을 편하게 만들기 위한 환경이 설정돼야 하기 때문에 로그 레벨이 DEBUG나 TRACE 정도가 되어야 하고, 개발만을 위한 DB가 따로 설정돼야 한다. 또한 Release 환경은 사용자가 직접적으로 접하는 환경이기 때문에 로그 레벨이 ERROR 정도로 설정되어야 하고 DB가 별도로 설정돼야 한다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', 'Apple SD Gothic Neo', Arial, sans-serif; letter-spacing: 0px;&quot;&gt;즉, application.properties 파일이 개발 환경 별로 다르게 설정돼야 한다. 그렇다면 어떻게 개발 환경 별로 application.properties를 다르게 설정할 수 있을까? 지금부터 이에 대해 알아보자.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', 'Apple SD Gothic Neo', Arial, sans-serif; letter-spacing: 0px;&quot;&gt;개발 환경 별로 서로 다른 application.properties 파일 설정하기&lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', 'Apple SD Gothic Neo', Arial, sans-serif; letter-spacing: 0px;&quot;&gt;Spring Boot의 프로파일 기반의 설정 파일을 지원하기 때문에 애플리케이션 실행 시 설정 파일을 지정할 수 있다. 즉, 애플리케이션&amp;nbsp; 실행 시&amp;nbsp; application.properties에 우선하는 설정 파일을 지정하면 application.properties의 설정 값들을 기본으로 지정된 설정 파일에 설정된 값들이 덮어 씌워진다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', 'Apple SD Gothic Neo', Arial, sans-serif; letter-spacing: 0px;&quot;&gt;이러한 파일들은 기본적으로 application-[개발 환경].properties이라는 이름을 가지며, 만약 Dev,&amp;nbsp;Qa,&amp;nbsp;Release별로 다른 설정 파일을 만들어야 한다면 이들의 이름은 application-dev.properties, application-qa.properties, application-release.properties가 된다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', 'Apple SD Gothic Neo', Arial, sans-serif; letter-spacing: 0px;&quot;&gt;먼저 각 파일을 application.properties와 같은 디렉토리에 만들어보자. 만들어진 모양은 다음과 같다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2024-11-16 오후 8.39.28.png&quot; data-origin-width=&quot;538&quot; data-origin-height=&quot;316&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/rjzRV/btsKMjAeAPm/Cy800OT5K9Qt8tkUa1REwk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/rjzRV/btsKMjAeAPm/Cy800OT5K9Qt8tkUa1REwk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/rjzRV/btsKMjAeAPm/Cy800OT5K9Qt8tkUa1REwk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FrjzRV%2FbtsKMjAeAPm%2FCy800OT5K9Qt8tkUa1REwk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;500&quot; height=&quot;294&quot; data-filename=&quot;스크린샷 2024-11-16 오후 8.39.28.png&quot; data-origin-width=&quot;538&quot; data-origin-height=&quot;316&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;각 파일의 내부는 다음과 같은 모양을 가진다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;application-dev.properties:&lt;/p&gt;
&lt;div style=&quot;background-color: #1e1f22; color: #bcbec4;&quot;&gt;
&lt;pre class=&quot;ini&quot;&gt;&lt;code&gt;logging.level.org.springframework=debug&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;application-qa.properties:&lt;/p&gt;
&lt;div style=&quot;background-color: #1e1f22; color: #bcbec4;&quot;&gt;
&lt;pre class=&quot;ini&quot;&gt;&lt;code&gt;logging.level.org.springframework=warn&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;application-release.properties:&lt;/p&gt;
&lt;div style=&quot;background-color: #1e1f22; color: #bcbec4;&quot;&gt;
&lt;pre class=&quot;ini&quot;&gt;&lt;code&gt;logging.level.org.springframework=error&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;각 파일 내부에서는 로그 레벨을 서로 다르게 설정하도록 했다. Dev에서는 DEBUG로, Qa에서는 WARN으로 RELEASE에서는 ERROR로 설정해 각 실행 환경 별로 필요한 로그만 출력되게 했다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이제 모든 준비가 마쳐졌다. 이제 위에서 만든 application.properties을 사용하는 방법을 알아보자.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;사용할 설정 파일 지정하기&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;특정 설정 파일을 사용하기 위해서는 application.properties의 spring.profiles.active 값을 지정해주면 된다. 만약 application-dev.properties를 사용하고 싶다면 값을 dev로 application-qa.properties를 사요하고 싶다면 값을 qa로 application-release.properties를 사용하고 싶다면 값을 release로 설정하면 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다음과  dev를 사용하기 위해 spring.profiles.active=dev라고 설정해보자.&lt;/p&gt;
&lt;div style=&quot;background-color: #1e1f22; color: #bcbec4;&quot;&gt;
&lt;pre class=&quot;kotlin&quot; data-ke-language=&quot;kotlin&quot;&gt;&lt;code&gt;spring.application.name=settings

spring.profiles.active=dev&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그런 후 애플리케이션을 실행하면 다음과 같이 DEBUG로그가 나오는 것을 볼 수 있다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2024-11-16 오후 8.51.45.png&quot; data-origin-width=&quot;2126&quot; data-origin-height=&quot;400&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bmUNNV/btsKM2EyvhK/wXfXQbKKqkyjlkdIgD0sTk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bmUNNV/btsKM2EyvhK/wXfXQbKKqkyjlkdIgD0sTk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bmUNNV/btsKM2EyvhK/wXfXQbKKqkyjlkdIgD0sTk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbmUNNV%2FbtsKM2EyvhK%2FwXfXQbKKqkyjlkdIgD0sTk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2126&quot; height=&quot;400&quot; data-filename=&quot;스크린샷 2024-11-16 오후 8.51.45.png&quot; data-origin-width=&quot;2126&quot; data-origin-height=&quot;400&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt; jar 파일 실행 시 설정 파일 지정하기&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;스프링 애플리케이션은 jar 로 패키징한 후 실행되는 것이 일반적이다. 이런 경우 특정 프로필을 사용하려면 다음과 같은 명령어를 사용하면 된다.&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1731758214436&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;java -jar springapplication.jar --spring.profiles.active=release&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이를 확인하기 위해 먼저 jar 파일을 빌드해보자. 다음 명령어를 통해 스프링부트 애플리케이션용 jar 파일을 빌드할 수 있다.&lt;/p&gt;
&lt;pre id=&quot;code_1731758255450&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt; ./gradlew bootJar&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그러면 build/libs 디렉토리에 다음과 같은 jar파일이 생긴다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2024-11-16 오후 8.57.58.png&quot; data-origin-width=&quot;594&quot; data-origin-height=&quot;310&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/voJfn/btsKMjUwWoP/Ezif3ZnM3Sx1TVc6KwY6G0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/voJfn/btsKMjUwWoP/Ezif3ZnM3Sx1TVc6KwY6G0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/voJfn/btsKMjUwWoP/Ezif3ZnM3Sx1TVc6KwY6G0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FvoJfn%2FbtsKMjUwWoP%2FEzif3ZnM3Sx1TVc6KwY6G0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;594&quot; height=&quot;310&quot; data-filename=&quot;스크린샷 2024-11-16 오후 8.57.58.png&quot; data-origin-width=&quot;594&quot; data-origin-height=&quot;310&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이제 다음 명령어를 사용해 application-release.properties를 사용하도록 설정해 애플리케이션을 실행해보자.&lt;/p&gt;
&lt;pre id=&quot;code_1731758362351&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;java -jar build/libs/settings-0.0.1-SNAPSHOT.jar --spring.profiles.active=release&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그러면 다음과 같이 INFO 수준의 로그만 나오는 것을 확인할 수 있다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2024-11-16 오후 8.59.08.png&quot; data-origin-width=&quot;3112&quot; data-origin-height=&quot;810&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/y57im/btsKMo9au1k/Jfu32IwfSq5pvsOl6Q7d8K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/y57im/btsKMo9au1k/Jfu32IwfSq5pvsOl6Q7d8K/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/y57im/btsKMo9au1k/Jfu32IwfSq5pvsOl6Q7d8K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fy57im%2FbtsKMo9au1k%2FJfu32IwfSq5pvsOl6Q7d8K%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;3112&quot; height=&quot;810&quot; data-filename=&quot;스크린샷 2024-11-16 오후 8.59.08.png&quot; data-origin-width=&quot;3112&quot; data-origin-height=&quot;810&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;전체 코드:&amp;nbsp;&lt;a href=&quot;https://github.com/seyoungcho2/LearnSpringKotlin/tree/main/settings/setting-profiles&quot;&gt;GitHub&lt;/a&gt;&lt;br /&gt;이 프로젝트가 도움이 되셨다면 &lt;a href=&quot;https://github.com/seyoungcho2/LearnSpringKotlin&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;저장소&lt;/a&gt;에 Star⭐️를 눌러주세요! &lt;a href=&quot;https://github.com/seyoungcho2/LearnSpringKotlin/stargazers&quot;&gt;Stargazers&lt;/a&gt;는 다음 페이지에서 확인할 수 있습니다.&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>Spring/Settings</category>
      <category>application.properties</category>
      <category>Dev</category>
      <category>development environment</category>
      <category>QA</category>
      <category>release</category>
      <category>Spring</category>
      <category>Spring boot</category>
      <category>스프링</category>
      <category>코프링</category>
      <author>Dev.Cho</author>
      <guid isPermaLink="true">https://kotlinworld.tistory.com/587</guid>
      <comments>https://kotlinworld.tistory.com/587#entry587comment</comments>
      <pubDate>Wed, 27 Nov 2024 07:02:06 +0900</pubDate>
    </item>
  </channel>
</rss>