<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <title>ha_ella.log</title>
        <link>https://velog.io/</link>
        <description></description>
        <lastBuildDate>Thu, 21 Jul 2022 05:05:29 GMT</lastBuildDate>
        <docs>https://validator.w3.org/feed/docs/rss2.html</docs>
        <generator>https://github.com/jpmonette/feed</generator>
        <copyright>Copyright (C) 2019. ha_ella.log. All rights reserved.</copyright>
        <atom:link href="https://v2.velog.io/rss/ha_ella" rel="self" type="application/rss+xml"/>
        <item>
            <title><![CDATA[컴포넌트 스캔과 의존관계 자동 주입]]></title>
            <link>https://velog.io/@ha_ella/%EC%BB%B4%ED%8F%AC%EB%84%8C%ED%8A%B8-%EC%8A%A4%EC%BA%94%EA%B3%BC-%EC%9D%98%EC%A1%B4%EA%B4%80%EA%B3%84-%EC%9E%90%EB%8F%99-%EC%A3%BC%EC%9E%85</link>
            <guid>https://velog.io/@ha_ella/%EC%BB%B4%ED%8F%AC%EB%84%8C%ED%8A%B8-%EC%8A%A4%EC%BA%94%EA%B3%BC-%EC%9D%98%EC%A1%B4%EA%B4%80%EA%B3%84-%EC%9E%90%EB%8F%99-%EC%A3%BC%EC%9E%85</guid>
            <pubDate>Thu, 21 Jul 2022 05:05:29 GMT</pubDate>
            <description><![CDATA[<blockquote>
<p>지금까지 스프링 빈을 등록할 때는 자바 코드의 @Bean이나 XML의 &lt;bean&gt; 등을 통해서 직접 스프링 빈을 설정해줬다.
빈 등록을 빼먹거나 반복 작업이라는 단점이 존재</p>
</blockquote>
<h2 id="component-scan-이란">Component scan 이란?</h2>
<p><code>@Bean</code> <code>&lt;bean&gt;</code> 등의 설정 정보가 없어도 스프링이 자동으로 스프링 빈을 등록해주는 기능</p>
<h3 id="사용-방법">사용 방법</h3>
<pre><code>@Configuration
@ComponentScan
public class AppConfig {
}</code></pre><p><code>@ComponentScan</code>을 사용하면 되며, 이 컴포넌트 스캔 어노테이션은 <code>@Component</code> 가 붙은 class 찾아서 자동으로 스프링 빈으로 등록해준다.</p>
<pre><code>@Component
public class MemberRespository {
}</code></pre><h3 id="대상-제외">대상 제외</h3>
<pre><code>@Configuration
@ComponentScan(
    excludeFilters = @ComponentScan.Filter(type = FilterType.ANNOTATION, classes = Configuration.class)
)
public class AppConfig {
}</code></pre><p><code>excludeFilters</code>는 컴포넌트 스캔이 될 때 제외시킬 목록을 말한다.
<code>@Configuration</code> 소스코드를 열어보면 <code>@Component</code> 어노테이션을 갖고 있기 때문에 컴포넌트 스캔 대상에 포함된다.
컴포넌트 스캔을 사용하면 <code>@Configuration</code>이 붙은 설정 정보도 자동으로 등록되기 때문에, AppConfig, TestConfig 등 설정정보도 함계 등록, 실행된다. 그래서 <code>excludeFilters</code>를 이용해서 설정정보는 컴포넌트 스캔 대상에서 제외시킨다.</p>
<h3 id="controller-service-repository">@Controller, @Service, @Repository</h3>
<p><img src="https://velog.velcdn.com/images/ha_ella/post/471b9391-a920-48de-8fa5-613391c9049e/image.png" alt=""></p>
<p>springframework 에서 제공해주는 <code>@Contoller</code>, <code>@Service</code>, <code>@Repository</code> 는 코드 내부에 <code>@Component</code>를 가지고 있다.
따라서 각 코드를 작성할 때 별도로 <code>@Component</code>를 붙여주지 않아도 자동으로 컴포넌트 스캔 대상에 포함되기 때문에 스프링 빈으로 등록된다.</p>
<pre><code>@Service
public class MemberServiceImpl {
}</code></pre><pre><code>@Repository
public class MemberRepository {
}</code></pre><pre><code>@Contoller
public class MemberController {
}</code></pre><p><img src="https://velog.velcdn.com/images/ha_ella/post/e2521ed5-0bfb-48a4-95ce-6ce0bf23608c/image.png" alt="RestContoller"></p>
<p><code>@Contoller</code>외에 REST API 를 만들기 위해 자주 사용하는 <code>@RestContoller</code>안에는 <code>@Contoller</code>를 포함하기 때문에 이것 또한 컴포넌트 스캔 대상에 포함된다.</p>
<pre><code>@RestContoller
public class MemberContoller {
}</code></pre><h3 id="동작-방식">동작 방식</h3>
<p><code>@ComponentScan</code>은 <code>@Component</code>가 붙은 모든 클래스를 스프링 빈으로 등록한다.
이때 스프링 빈의 기본 이름은 클래스명을 사용하되 맨 앞글자만 소문자를 사용한다.</p>
<blockquote>
<p>기본: MemberServiceImpl 클래스 -&gt; memberServiceImpl
지정: <code>@Component(&quot;memberService&quot;)</code> 방식으로 직접 이름 지정이 가능</p>
</blockquote>
<h2 id="의존관계-자동-주입">의존관계 자동 주입</h2>
<p>기존에는 @Bean을 통해 의존관계 주입을 직접 설정해줬지만 <code>@Autowired</code>를 사용하면 스프링 컨테이너가 스프링 빈을 자동으로 주입해준다.</p>
<pre><code>@Service
public class MemberServiceImpl impliments MemberService {
    private final MemberRepository memberRepository;

    @Autowired
    public MemberServiceImpl(MemberRepository memberRepository) {
        this.memberRepository = memberRespository;
    }
}</code></pre><blockquote>
<p>의존관계 주입 방식에는 여러가지가 있는데 그 중 생성자 주입을 추천한다.</p>
</blockquote>
]]></description>
        </item>
        <item>
            <title><![CDATA[Java 기초지식]]></title>
            <link>https://velog.io/@ha_ella/Java-%EA%B8%B0%EC%B4%88%EC%A7%80%EC%8B%9D</link>
            <guid>https://velog.io/@ha_ella/Java-%EA%B8%B0%EC%B4%88%EC%A7%80%EC%8B%9D</guid>
            <pubDate>Thu, 21 Jul 2022 02:38:07 GMT</pubDate>
            <description><![CDATA[<h1 id="java-기초지식">Java 기초지식</h1>
<h2 id="java-애플리케이션-실행-과정">Java 애플리케이션 실행 과정</h2>
<ol>
<li>Compiler 가 Java Source(.javac)를 Byte code(.calss)로 변환</li>
<li>Class Loader가 Byte code를 Runtime Data Area(런타입 데이터 영역, 메모리)에 로드시킴</li>
<li>로딩된 Byte code가 Exceution Engine(실행엔진)에 의해서 실행되게 됨</li>
</ol>
<blockquote>
<p>Byte Code: JVM에서 실행되게끔 만들어진 자바 코드 .class</p>
</blockquote>
<h2 id="java-memory-구조">Java Memory 구조</h2>
<blockquote>
<p>스레드별: PC Register, JVM stack, Native Method stack
공통: Method Area, Heap</p>
</blockquote>
<ul>
<li>PC Register: 명령어</li>
<li>JVM Stack: 함수 매개변수, 지역변수, 리턴 정보</li>
<li>Native Method stack: Java 외에 언어 (C, C++ 등)로 작성된 코드들이 실행됨</li>
<li>Heap: 사용자가 사용하면서 생긴 데이터, 동적 할당</li>
<li>Method Area: 클래스별로 전역변수, 정적변수들, 메서드 정보들이 저장됨</li>
</ul>
<h2 id="가비지커렉션-garbage-collection-gc">가비지커렉션 (Garbage Collection, GC)</h2>
<blockquote>
<p>JVM에서 Memory 관리해주는 모듈</p>
</blockquote>
<p>Heap Memory를 관리하기 위해서 불필요한 Memory 삭제
Mark and sweep 방식으로 Memory 에 있는 변수, 메서드들이 어디서 참조되고 있는지 확인해보고 참조되고 있는 영역이 없다면 삭제
이때, Thread가 잠깐 중단되기 때문에 성능이 떨어진다</p>
]]></description>
        </item>
    </channel>
</rss>