<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <title>bk_log.log</title>
        <link>https://velog.io/</link>
        <description>Server Developer</description>
        <lastBuildDate>Wed, 23 Oct 2019 12:27:03 GMT</lastBuildDate>
        <docs>https://validator.w3.org/feed/docs/rss2.html</docs>
        <generator>https://github.com/jpmonette/feed</generator>
        <image>
            <title>bk_log.log</title>
            <url>https://images.velog.io/images/bk_log/profile/71f90d60-f33e-11e9-b2d3-63469f7f23e7/KakaoTalkPhoto2018-12-26-20-01-10.png</url>
            <link>https://velog.io/</link>
        </image>
        <copyright>Copyright (C) 2019. bk_log.log. All rights reserved.</copyright>
        <atom:link href="https://v2.velog.io/rss/bk_log" rel="self" type="application/rss+xml"/>
        <item>
            <title><![CDATA[Spring boot AutoConfiguration]]></title>
            <link>https://velog.io/@bk_log/Spring-boot-AutoConfiguration</link>
            <guid>https://velog.io/@bk_log/Spring-boot-AutoConfiguration</guid>
            <pubDate>Wed, 23 Oct 2019 12:27:03 GMT</pubDate>
            <description><![CDATA[<h2 id="spring-의-conditional">spring 의 @Conditional</h2>
<p>spring boot 의 AutoConfiguration 은 <code>@Conditional</code> 에 기반한다. 스프링 기반의 애플리케이션을 개발할때 조건부적으로 beans 을 등록할 필요가 생긴다. 예를들어 로컬 환경에서는 dev db, 프로덕션 환경에서는 production db 에 붙어야 하는 경우가 있다. 그때 properties files 에 database connection 정보를 넣고, 환경에 따라 적절한 파일을 사용할 수 있다. 그런데 각각의 환경에 따라 변경점이 필요하다면 configuration 을 변경할 수 있어야 한다.</p>
<p>Spring 3.1 에서 <code>Profiles</code> 개념이 도입되어 동일한 type 의 beans 을 등록할 수 있고 하나 이상의 profiles 에 연관시킬 수 있다. 그리고 application 을 실행시킬때 원하는 profiles 만 활성화시킬 수 있고, 활성화된 profiles 에 연관된 beans 만 등록된다.</p>
<p>Spring 4 에서 <code>@Conditional</code> 이 도입되어 Spring beans 를 조건에 따라 등록할 수 있게 되었다.</p>
<h2 id="spring-boot-autoconfiguration">spring boot AutoConfiguration</h2>
<h4 id="enableautoconfiguration">@EnableAutoConfiguration</h4>
<p>이 어노테이션을 통해 스프링 부트는 AutoConfiguration 설정이 되고, <code>@SpringBootApplication</code> 의 내부를 보면 이 주석이 포함되어 있다. 또 @SpringBootApplication 에는 <code>@ComponentScan</code> 이 있어 classpath 에서 components 들을 스캐닝하고 Condition 에 매칭되는 beans 을 등록함으로써 ApplicationContext 의 자동 구성이 가능한 것이다.</p>
<h4 id="autoconfiguration-구현-방법">AutoConfiguration 구현 방법</h4>
<p>AutoConfiguration 클래스는 @Configuration 으로 설정 클래스로 만들고, @EnableConfigurationProperties 로 사용자 정의 특성을 받아 하나 이상의 Conditional bean 등록 메소드를 바인딩한다.</p>
<pre><code class="language-java">@Configuration
@ConditionalOnClass({ DataSource.class, EmbeddedDatabaseType.class })
@EnableConfigurationProperties(DataSourceProperties.class)
@Import({ Registrar.class, DataSourcePoolMetadataProvidersConfiguration.class })
public class DataSourceAutoConfiguration {
  // ...
  @Configuration
  @ConditionalOnClass(DataSourceAutoConfiguration.EmbeddedDataSourceCondition.class)
  @Import(EmbeddedDataSourceConfiguration.class)
  protected static class EmbeddedConfiguration {
  }


}</code></pre>
<h4 id="conditionalonclass-conditionalonproperty-conditionalonmissingbean-등">@ConditionalOnClass, @ConditionalOnProperty, @ConditionalOnMissingBean 등...</h4>
<p>위 어노테이션은 @Conditional 을 포함하여 각각의 해당 조건이 일치하는 경우에만 ApplicationContext 에 Bean 으로 등록된다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[Java] 타입 추론]]></title>
            <link>https://velog.io/@bk_log/Java-%ED%83%80%EC%9E%85-%EC%B6%94%EB%A1%A0</link>
            <guid>https://velog.io/@bk_log/Java-%ED%83%80%EC%9E%85-%EC%B6%94%EB%A1%A0</guid>
            <pubDate>Tue, 22 Oct 2019 15:57:44 GMT</pubDate>
            <description><![CDATA[<h1 id="java-9-이하">Java 9 이하</h1>
<p>Java 10에서 <code>var</code>라는 Local Variable Type-Inference 가 추가되었다. 그 전에도 Generic 과 Lambda 를 사용할 때 <code>타입 추론</code>이라는 단어를 사용하는 것을 들었다.</p>
<blockquote>
<p>타입 추론이란 코드 작성 당시 타입이 정해지지 않았지만, 컴파일러가 그 타입을 유추하는 것이다.</p>
</blockquote>
<h2 id="generic">Generic</h2>
<h1 id="java-10-이상">Java 10 이상</h1>
<h2 id="var">var</h2>
<p>자바 10부터 타입 추론을 지원하는 <code>var</code>키워드가 추가되었다. 이 키워드는 <code>local variable</code>이면서 선언과 동시에 <code>initializer</code>가 필수적으로 요구된다.</p>
<ul>
<li>참고 : <a href="https://www.baeldung.com/java-10-local-variable-type-inference">https://www.baeldung.com/java-10-local-variable-type-inference</a><pre><code class="language-java">// java 9 이하
String message = &quot;data&quot;;
// java 10 이상
var message = &quot;the initializer present on the right-hand side&quot;;</code></pre>
<blockquote>
<p>We don&#39;t provide the data type of message. Instead, we mark the message as a var, and the compiler infers the type of message from the type of the initializer present on the right-hand side.</p>
</blockquote>
<ul>
<li>&quot;컴파일러는 오른쪽에 초기화 값으로 제공되는 것을 통해 타입을 유추한다.&quot;</li>
</ul>
</li>
</ul>
<h4 id="주의-및-신경써야할-부분">주의 및 신경써야할 부분</h4>
<ul>
<li><p>자바 7에서 다이아몬드 연산자라는 방식이 추가되었는데, 자바 10에서 나온 var 와 함께 사용하게 되면 컴파일 에러가 발생한다.</p>
<pre><code class="language-java">// 컴파일러가 타입을 유추할 수 있는 정보가 없다.
var messages = new ArrayList&lt;&gt;();</code></pre>
</li>
<li><p>가독성에 있어, 다른 개발자가 읽을때 가독성이 좋을지 고민해야할 것 같다. 다른 사람의 코드를 읽는 경우는 IDE 상에서 코드를 받아 보는 경우도 많겠지만, PR 이 올라와서 github 이나 bitbucket 웹 상으로 보는 경우도 많은 것 같다. 아래 두 경우가 있는데, </p>
<ol>
<li><p>해당 위치만 보고 message 에 어떤 타입의 데이터가 할당될지 알 수 있는 경우</p>
<pre><code class="language-java">var message = &quot;문자열 입니다.&quot;;</code></pre>
</li>
<li><p>예시에서는 바로 아래 메소드가 있었지만, 다른 클래스 파일에 있는 경우 두 군데 이상의 파일을 조회해야 한다. 그런데 getMessage() 정도는 충분히 코드를 읽는데 방해가 되는 것 같지도 않다. 호불호인것 같기도하고, 네이밍을 잘하면 커버할 수 있는 단점이라고 생각되기도 한다.</p>
<pre><code class="language-java">public void some() {
   var message = getMessage();
}

public Message getMessage() {
     // ...
   return new Message(&quot;객체입니다.&quot;, MessageType.SOME);
}</code></pre>
</li>
</ol>
</li>
</ul>
]]></description>
        </item>
    </channel>
</rss>