<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>HaileyKim</title>
    <link>https://haileykim2014.tistory.com/</link>
    <description></description>
    <language>ko</language>
    <pubDate>Wed, 8 Apr 2026 12:09:40 +0900</pubDate>
    <generator>TISTORY</generator>
    <ttl>100</ttl>
    <managingEditor>haileykim2014</managingEditor>
    <image>
      <title>HaileyKim</title>
      <url>https://tistory1.daumcdn.net/tistory/4356323/attach/47db063d4ac04a1b98e43a3309506aeb</url>
      <link>https://haileykim2014.tistory.com</link>
    </image>
    <item>
      <title>@Jacksonized</title>
      <link>https://haileykim2014.tistory.com/421</link>
      <description>&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR'; color: #333333; text-align: start;&quot;&gt;회사에서도 &lt;span style=&quot;font-family: 'Noto Serif KR'; color: #333333; text-align: start;&quot;&gt;직렬화/ 역직렬화를 위해&lt;/span&gt;&amp;nbsp;사용하는 jackson 라이브러리.&lt;/span&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;마침 &lt;/span&gt;넥텝 과제하던 중 &lt;/span&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;알게된 어노테이션 @Jacksonized를 정리해본다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;Jackson 라이브러리란 ?&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;spring-boot-starter-web 의존성을 주입하면 자동으로 이 라이브러리가 포함된다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;JSON 컨버팅할때 jackson을 사용하게된다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;@Jacksonized&amp;nbsp;&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;역직렬화를 위한 어노테이션이다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;불변성을 보장하면서 역직렬화를 가능하게 한다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;@Jacksonized 어노테이션은 @Builder 또는 @SuperBuilder와 함께 사용한다. &lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;이 어노테이션은 생성된 빌더 클래스를 Jackson의 역직렬화에 사용할 수 있도록 자동으로 구성합니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt; @Builder 또는 @SuperBuilde가 적용된 상황에서만 가능하다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;빌더의 동작을 변경하지 않는다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1686037196075&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;@Jacksonized @Builder
@JsonIgnoreProperties(ignoreUnknown = true)
public class JacksonExample {
	private List&amp;lt;Foo&amp;gt; foos;
}&lt;/code&gt;&lt;/pre&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&amp;nbsp;&lt;/h4&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;예시 코드&lt;/span&gt;&lt;/h4&gt;
&lt;pre id=&quot;code_1686039948686&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;@Getter
@Builder
@Jacksonized
class JacksonExample {
  private final String name;
  private final int age;
}

class JacksonExampleTest {
  @Test
  void testJacksonSerializationAndDeserialization() throws IOException {
    // 객체 생성
    JacksonExample example = JacksonExample.builder()
        .name(&quot;Bob&quot;)
        .age(25)
        .build();

    // ObjectMapper를 사용하여 객체를 JSON 문자열로 직렬화
    ObjectMapper objectMapper = new ObjectMapper();
    String json = objectMapper.writeValueAsString(example);

    // JSON 문자열을 사용하여 객체를 역직렬화
    JacksonExample deserializedExample = objectMapper.readValue(json, JacksonExample.class);

    // 값 비교
    assertEquals(&quot;Bob&quot;, deserializedExample.getName());
    assertEquals(25, deserializedExample.getAge());
  }
}&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;JackonExample 클래스에 @Jacksonized 어노테이션을 적용했다.&lt;/li&gt;
&lt;li&gt;Jackson 의 직렬화 및 역직렬화에 사용되는 빌더 클래스를 자동으로 구성한다.&lt;/li&gt;
&lt;li&gt;위 테스트 코드에서 객체를 생성하고 ObjectMapper를 사용하여 해당 객체를 json문자열로 직렬화 한후 다시 역직렬화한다.&lt;/li&gt;
&lt;li&gt;역직렬화된 객체의 값과 원래의 값이 일치하는지 확인한다.&amp;nbsp;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;플젝 적용&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;아래는 넥텝 과제에 적용한 내 코드 일부분이다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1686039155604&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;package cart.dto;

import cart.domain.Cart;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Getter;
import lombok.extern.jackson.Jacksonized;

@Getter
@AllArgsConstructor
@Jacksonized
@Builder
public class CartCreateDto {

  private final Long productId;
  private final int count;

  public Cart toEntity(Long memberId) {
    return Cart.builder()
        .productId(getProductId())
        .memberId(memberId)
        .count(getCount())
        .build();
  }
}&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;@Jacksonized 어노테이션을 사용해서 CartCreateDto 클래스가 Jackson과 함께 동작한다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;Jacksonized 어노테이션과 Builder 어노테이션을 같이 사용해 빌더 패턴이 생성된다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;위 클래스의 객체를 Json 형식으로 직렬화해서 요청 바디에 넣는 테스트 코드를 작성하여 직렬화를 처리한다.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1686039427595&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;  @DisplayName(&quot;로그인한 유저의 장바구니에 상품을 추가한다.&quot;)
  @Test
  void addItemToCart() {
    CartCreateDto createDto = CartCreateDto.builder()
        .productId(1L)
        .count(1)
        .build();

    var result = given()
        .auth().preemptive().basic(member.getEmail(), member.getPassword())
        .contentType(MediaType.APPLICATION_JSON_VALUE)
        .accept(MediaType.APPLICATION_JSON_VALUE)
        .body(createDto)
        .when().post(&quot;/carts/add-to-cart&quot;)
        .then().log().all()
        .extract();

    assertThat(cartService.cartProducts(member).size()).isEqualTo(2);
    assertThat(result.statusCode()).isEqualTo(HttpStatus.OK.value());
  }&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;요청을 보낼때 createDto 객체가 요청 바디에 담겨 전송된다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;서버에서 json 바디를 역직렬화하여 cartCreateDto 객체로 변환한다.&amp;nbsp;&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&amp;nbsp;&lt;/h4&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;참고&amp;nbsp;&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&lt;a href=&quot;https://www.baeldung.com/java-jackson-deserialization-lombok&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://www.baeldung.com/java-jackson-deserialization-lombok&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&lt;a href=&quot;https://projectlombok.org/features/experimental/Jacksonized&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://projectlombok.org/features/experimental/Jacksonized&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;</description>
      <category>*/What I did today</category>
      <category>르</category>
      <author>haileykim2014</author>
      <guid isPermaLink="true">https://haileykim2014.tistory.com/421</guid>
      <comments>https://haileykim2014.tistory.com/421#entry421comment</comments>
      <pubDate>Tue, 6 Jun 2023 17:29:13 +0900</pubDate>
    </item>
    <item>
      <title>객체지향</title>
      <link>https://haileykim2014.tistory.com/419</link>
      <description>&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&lt;b&gt;프로그래밍 패러다임&lt;/b&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;패러다임&amp;nbsp;&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;한 시대의 사회전체가 공유하는 이론이나 방법, 문제 의식등의 체계&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;프로그래밍 패러다임&amp;nbsp;&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;특정 시대의 어느 성숙한 개발자 공동체에 의해 수용된 프로그래밍 방법과 문제 해결 방법, 프로그래밍 스타일.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;우리가 어떤 프로그래밍 패러다임을 사용하느냐에 따라 우리가 해결할 문제를 바라보는 방식과 프로그램을 작성하는 방법이 달라진다. 프로그래밍 언어마다 채택하는 프로그래밍 패러다임이 다르다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;패러다임 전환&amp;nbsp;&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;절차형 패러다임에서 객체지향 패러다임으로의 변화를 가리킨다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;프로그래밍 패러다임의 역할&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;개발자 공동체가 동일한 프로그래밍 스타일과 모델을 공유할 수 있게 함으로써 불필요한 부분에 대한 의견 충돌을 방지한다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;또한 교육시킴으로써 동일한 규칙과 방법을 공유하는 개발자로 성장하도록 준비시킬 수 있다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;특정한 종류의 문제를 해결하는데 필요한 일련의 개념들을 지원한다.&lt;/span&gt;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;소극장 애플리케이션의 문제&amp;nbsp;&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;의도&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;Theater : 관람객을 입장&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;TickerSeller : 티켓을 판매&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;Audience :&amp;nbsp; 티켓 구매&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock floatLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1368&quot; data-origin-height=&quot;896&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/sjDaC/btr5oz4Z13h/3z7GCMA59tH3UFS8UwgFLK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/sjDaC/btr5oz4Z13h/3z7GCMA59tH3UFS8UwgFLK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/sjDaC/btr5oz4Z13h/3z7GCMA59tH3UFS8UwgFLK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FsjDaC%2Fbtr5oz4Z13h%2F3z7GCMA59tH3UFS8UwgFLK%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;327&quot; data-origin-width=&quot;1368&quot; data-origin-height=&quot;896&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;1. 예상을 빗나가는 코드 예시&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;내가 관람객이라고 가정할때, 관람객의 입장에서 소극장이라는 제3자가 초대장을 확인하기 위해 관람객의 가방을 마음대로 열어본다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;의도 : 티켓을 구매하는 관람객이 가방 안에서 돈을 직접 꺼내 판매원에게 지불한다.&lt;/span&gt;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;2. 변경에 취약한 코드 예시&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;의존성 문제. 어떤 객체가 변경될 때 그 객체에게 의존하는 다른 객체로 함께 변경될 수 있다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;Theater가 Audience와 TicketSeller의 상세한 내부 구현까지 알고 있어야 한다. &lt;/span&gt;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;설계 개선&lt;/span&gt;&lt;/h4&gt;
&lt;pre id=&quot;code_1679504257057&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// 문제코드
public class Theater{
	private TicketSeller ticketSeller;
    
    public Theater(TicketSeller ticketseller){
    this.ticketSeller = ticketSelelr;
    }
    
    public void enter(Audience audience){
        if(audience.getBag().hasInvitation()){ //TicketSeller의 sellTo()메소드로 옮긴다. TicketSeller의 내부구현을 캡슐화
            Ticket ticket = ticketSeller.getTicketOffice().getTicket();
            audience.getBag().setTicket(ticket);
        }else{
            Ticket ticket = ticketSeller.getTicketOffice().getTicket();
            audience.getBag().minusAmount(ticket.getFee());
            ticketSeller.getTicketOffice().plusAmount(ticket.getFee());
            audience.getBag().setTicket(ticket);
        }
	}
}&lt;/code&gt;&lt;/pre&gt;
&lt;pre id=&quot;code_1679504423902&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;//개선 코드
public class Theater {
	private TicketSeller ticketSeller;
    
    public Theater(TicketSeller ticketSeller){
    	this.ticketSeller = ticketSeller;
        }
    
    public void enter(Audience audience){
    	ticketSeller.sellTo(audience); //TicketOffice에 접근하는 로직을 모두 ticketSeller.sellTo에 숨김
        }
    }&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock floatLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1330&quot; data-origin-height=&quot;880&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/XyNC5/btr5pFqejgv/GLrXQHs9VYCc9MDK9AJGM0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/XyNC5/btr5pFqejgv/GLrXQHs9VYCc9MDK9AJGM0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/XyNC5/btr5pFqejgv/GLrXQHs9VYCc9MDK9AJGM0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FXyNC5%2Fbtr5pFqejgv%2FGLrXQHs9VYCc9MDK9AJGM0%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;331&quot; data-origin-width=&quot;1330&quot; data-origin-height=&quot;880&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;1. 자율성을 높이기&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;관람객과 판매원을 자율적인 존재로 만든다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;Theater가 TicketSeller와 Audience에 세세한 부분까지 알지 못하도록 정보를 차단한다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;관람객이 스스로 가방 안의 현금과 초대장을 처리하고 판매원이 스스로 매표소의 티켓과 판매 요금을 다루게 한다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;1.1 캡슐화 개념적이나 물리적으로 객체 내부의 세부적인 사항을 감추는 것.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;객체 내부로의 접근을 제한해 객체와 객체 사이의 결합도를 낮춘다. -&amp;gt; 설계를 좀더 쉽게 변경 가능&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;접근 가능한 퍼블릭 메서드가 존재하지 않기때문에 외부에서 ticketOffice에 직접 접근할 수 없다. 오직 TicketSeller안에만 존재하게 된다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;1.2 수정된 Theater class 어디서도 ticketOffice에 접근하지 않는다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;Theater 는 &lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;ticketOffice가 TicketSeller내부에 존재하는 사실을 모른다.&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR'; color: #333333; text-align: start;&quot;&gt;Theater는 오직 &lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;TicketSeller 인터페이스에만 의존한다.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR'; color: #333333; text-align: start;&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;객체를 인터페이스와 구현으로 나누고 인터페이스만을 공개하는 것은 객체 사이의 결합도를 낮추고 변경하기 쉬운 코드를 작성한다.&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;2. 자신의 문제해결&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;판매자가 티켓을 판매하기 위해 &lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;ticketOffice를 사용하는 모든 부분을 &lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;TicketSeller 내부로 옮기고, 관람객이 티켓을 구매하기 위해 Bag을 사용하는 모든 부분을 Audience 내부로 옮긴다.&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR'; color: #333333; text-align: start;&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;자신의 문제를 스스로 해결하도록 코드를 변경한다.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;개선된 점&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR'; color: #333333; text-align: start;&quot;&gt;변경 용이성이 개선&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR'; color: #333333; text-align: start;&quot;&gt;TicketSeller의 내부 구현을 변경하더라도 &lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;Theater를 함께 변경할 필요가 없다. &lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;TicketSeller가 매표소가 아니라 은행에 돈을 보관하도록 만들고 싶으면 &lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;TicketSeller내부만 변경하면 된다.&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR'; color: #333333; text-align: start;&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;책임의 이동&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR'; color: #333333; text-align: start;&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;기존 코드는 책임이 Threater에 집중되어 있었다.&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR'; color: #333333; text-align: start;&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;독재자가 존재하지 않고, 각 객체에 책임이 적절하게 분배된다.&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR'; color: #333333; text-align: start;&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;데이터와 데이터를 사용하는 프로세스가 동일한 객체 안에 존재한다.&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;절차지향&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;개선전의 Theater는 절차적 프로그래밍이다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;Theater enter메서드는 프로세스이며, Audience, TicketSeller, Bag, TicketOffice는 데이터이다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;프로세스를 담당하는 Theater가 &lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&amp;nbsp;Audience, TicketSeller, Bag, TicketOffice 모두에 의존하고 있었다. 모든 처리가 하나의 클래스 안에 위치하고 나머지 클래스는 단지 데이터의 역할만 수행했다.&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;프로세스와 데이터를 별도의 모듈에 위치시키는 방식이 절차지향이다.&lt;/span&gt;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;객체지향 설계&lt;/span&gt;&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;자신의 문제를 스스로 처리하기 때문에 예측이 가능하고, 이해하기 쉬우며 객체 내부의 변경이 객체 외부에 파급되지 않도록 제어할 수 있어서 변경하기가 수월하다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;의존성 제거 : 불필요한 의존성을 제거-&amp;gt; 객체사이의 결합도를 낮추는 것&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;캡슐화 : Theater가 몰라도 되는 세부사항을 Audience와 TicketSeller 내부로 감춰 캡슐화&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;좋은 설계&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;변경을 수용할 수 있어야한다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;요구사항은 항상 변경된다.&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;오늘 요구하는 기능을 온전히 수행하면서 내일의 변경을 매끄럽게 수용할 수 있는 설계&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;&amp;nbsp;&lt;/p&gt;</description>
      <category>*/What I did today</category>
      <category>객체지향</category>
      <category>오브젝트</category>
      <author>haileykim2014</author>
      <guid isPermaLink="true">https://haileykim2014.tistory.com/419</guid>
      <comments>https://haileykim2014.tistory.com/419#entry419comment</comments>
      <pubDate>Thu, 23 Mar 2023 02:45:41 +0900</pubDate>
    </item>
    <item>
      <title>How to Achieve More</title>
      <link>https://haileykim2014.tistory.com/418</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;걸스인텍&amp;amp;원티드에서 진행한 워크샵에 다녀왔다. 생각보다 신청자 수가 많았다. 5:1의 경쟁률이었다고 한다 워후&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아름다운 광화문 뷰와 함께 토요일 아침을 알차게 보내고 왔다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1796&quot; data-origin-height=&quot;1016&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cc9Onn/btr3Qxnpx4F/nLQ1Tb1utIQApNTLATpba1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cc9Onn/btr3Qxnpx4F/nLQ1Tb1utIQApNTLATpba1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cc9Onn/btr3Qxnpx4F/nLQ1Tb1utIQApNTLATpba1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fcc9Onn%2Fbtr3Qxnpx4F%2FnLQ1Tb1utIQApNTLATpba1%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;1796&quot; height=&quot;1016&quot; data-origin-width=&quot;1796&quot; data-origin-height=&quot;1016&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;한국 마이크로소프트의 김성미 이사님께서 일하는 방법을 강연해주셨다 .김 이사님께서&lt;span&gt; &lt;/span&gt;공유해주신&lt;span&gt; &lt;/span&gt;소중한&lt;span&gt; &lt;/span&gt;경험담과&lt;span&gt; &lt;/span&gt;인사이트들을&lt;span&gt; &lt;/span&gt;정리해보았다&lt;span&gt;.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock floatLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;IMG_5628.JPG&quot; data-origin-width=&quot;2160&quot; data-origin-height=&quot;2880&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cnPoS5/btr3IZyhd3N/SJ111rEQ8vwL5bMLQHBte0/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cnPoS5/btr3IZyhd3N/SJ111rEQ8vwL5bMLQHBte0/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cnPoS5/btr3IZyhd3N/SJ111rEQ8vwL5bMLQHBte0/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcnPoS5%2Fbtr3IZyhd3N%2FSJ111rEQ8vwL5bMLQHBte0%2Fimg.jpg&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;2880&quot; data-filename=&quot;IMG_5628.JPG&quot; data-origin-width=&quot;2160&quot; data-origin-height=&quot;2880&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;꿈은 이루어진다 : 가짜 꿈들 사이에서 진짜 꿈을 찾는 과정에 시련이있다.&lt;/li&gt;
&lt;li&gt;행복은 전염된다 : 기여는 건강한 에너지, 선순환을 만든다.&lt;/li&gt;
&lt;li&gt;가슴 뛰는 일을 먼저하기 : 하고싶은 것에 일단 몸을 던지고, How to 고민하기&lt;/li&gt;
&lt;li&gt;주말 아침 4시간을 내 시간으로 갖기 : 가장 빨리 열리는 카페에 출근하는 직원과 함께 들어가 나만의 시간을 보내기, 3개월 이상 유지하기&lt;/li&gt;
&lt;li&gt;만다라트 기법으로 목표 세우고 성취하기&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;직종을 변경하면서도 긍정적인 에너지와 열정을 유지하는 방법을 배웠다. 워크샵이 끝나고 김성미 이사님께서 직접 친필 서명이 담긴 책을 선물해주셨다. 집에 돌아오면서 마음이 충만해진 느낌이었다. 세션에서 다 채우지 못한 내 만다라트도 채워봐야겠다. 그리고 다양한 분야에서 일하는 분들과 소통하면서 열정을 느낄 수 있어서 매우 좋았다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;걸스인텍&lt;span&gt; &lt;/span&gt;이벤트는&lt;span&gt; &lt;/span&gt;이번이&lt;span&gt; &lt;/span&gt;두&lt;span&gt; &lt;/span&gt;번째인데&lt;span&gt;, &lt;/span&gt;항상&lt;span&gt; &lt;/span&gt;알차고&lt;span&gt; &lt;/span&gt;얻어가는&lt;span&gt; &lt;/span&gt;것이&lt;span&gt; &lt;/span&gt;많다!&amp;nbsp;&lt;/p&gt;</description>
      <category>*/What I did today</category>
      <category>일이되게하는법 #HowtoAchieveMore #걸스인텍 #마이크로소프트 #원티드</category>
      <author>haileykim2014</author>
      <guid isPermaLink="true">https://haileykim2014.tistory.com/418</guid>
      <comments>https://haileykim2014.tistory.com/418#entry418comment</comments>
      <pubDate>Tue, 14 Mar 2023 22:28:50 +0900</pubDate>
    </item>
    <item>
      <title>DB Connection Pool</title>
      <link>https://haileykim2014.tistory.com/417</link>
      <description>&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;DB connection pool과 스레드 개수는 메모리와 관련이있다.&lt;/li&gt;
&lt;li&gt;많이 사용할 수록 메모리를 많이 점유한다.&lt;/li&gt;
&lt;li&gt;개수를 적게 지정하면 서버에서는 많은 요청을 처리하지 못하고 대기하게된다.&lt;/li&gt;
&lt;li&gt;WAS에서 기본 개수가 10~20개 정도이다.&lt;/li&gt;
&lt;li&gt;DB connection pool은 보통 40~50개로 지정하고 스레드 개수는 이보다 10개 정도 더 지정한다.&lt;/li&gt;
&lt;li&gt;스레드 개수 &amp;lt; DB connection pool : 스레드가 적은만큼 연결 필요가 없어진다.&lt;/li&gt;
&lt;li&gt;스레드 개수 &amp;gt; DB connection pool : 여유분을 갖도록위함이다.&lt;/li&gt;
&lt;li&gt;적합한 개수는 서버와 애플리케이션 상황에 따라 다르다.&lt;/li&gt;
&lt;li&gt;서비스 및 서버의 상황에 맞게 값을 지정해야한다. -&amp;gt; 성능테스트&lt;/li&gt;
&lt;li&gt;DB의 CPU 사용량이 100% 도달했다면 ? CPU를 점유하는 쿼리를 찾는다 -&amp;gt; 인덱스가 없거나, 테이블을 풀 스캔하는 쿼리가 있는지 , 쿼리의 플랜을 확인한다.&lt;/li&gt;
&lt;li&gt;DB connection pool 지정 개수를 전부 사용한다고 개수를 막 늘리면 DB사용량이 늘고 응답 시간이 느려진다&lt;/li&gt;
&lt;li&gt;DB의 CPU 사용량이 50% 미만이고 WAS의 CPU 사용량이 100%일때 : WAS의 애플리케이션을 튜닝한다. 이미 튜닝했다면 -&amp;gt; 커넥션풀을 늘리기, 서버 대수 늘리는것은 가장 마지막에 고려할 것&lt;/li&gt;
&lt;/ul&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;음..회사에서 DB의 CPU점유율이 상당히 높은 편이다..이유는 바로 가장많이 이용하는 부분의 쿼리들 때문!!&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 부분도 팀원들이랑 개선점 찾아서 진행하고싶다&lt;/p&gt;</description>
      <category>*/What I did today</category>
      <author>haileykim2014</author>
      <guid isPermaLink="true">https://haileykim2014.tistory.com/417</guid>
      <comments>https://haileykim2014.tistory.com/417#entry417comment</comments>
      <pubDate>Wed, 15 Feb 2023 03:26:09 +0900</pubDate>
    </item>
    <item>
      <title>Tree</title>
      <link>https://haileykim2014.tistory.com/416</link>
      <description>&lt;h4 data-ke-size=&quot;size20&quot;&gt;트리&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;0개 이상의 다른 노드에 대한 레퍼런스가 들어 있는 노드로 구성&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;한 노드를 참조하는 노드는 하나&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;노드는 구조체, 클래스로 표현&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;포인터 또는 레퍼런스만 있다면 어떤 언어로든 구현 가능&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;보통 노드의 공통적인 부분을 하나의 클래스로 정의하고 노드에 들어가는 데이터를 서브클래스를 만들어서 사용&lt;/p&gt;
&lt;pre id=&quot;code_1673281447119&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;public abstract class Node{
	private Node[] children;

	public Node(Node[] children){
    	this.children = children;
    }
    
    public int getNumChildren(){
    	return children.length;
    }
    
    public Node getChild(int index){
    	return children[index];
    }
}

public class IntNode extends Node{
	private int value;
    
    public IntNode(Node[] children. int value){
    super(children);
    this.value=value;
    }
    
    public int getValue(){
    return value;
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;부모 : 다른 노드를 가리키는 노드는 그 노드의 부모가 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;자식 : 루트를 제외한 모든 노드는 그 노드를 가리키는 노드의 자식이 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;자손 : 특정 노드로 부터 자식노드로 이어지는 경로를 따라 도달 할 수 있는 모든 노드는 그 특정 노드의 자손이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;조상 : 어떤 노드를 자손으로 삼고 있는 노드는 모두 그 노드의 조상이다.&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;h4 data-ke-size=&quot;size20&quot;&gt;이진트리&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;한 노드에 자식이 최대 두개 까지만 있을 수 있으며 그 두 자식은 각각 왼쪽 자식과 오른쪽 자식이라고 부른다.&lt;/p&gt;
&lt;pre id=&quot;code_1673281753891&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;//이진트리
public class Node{
	private Node left;
    private Node right;
    private int value;
    
    public Node(Node left,Node right,int value){
    	this.left = left;
        this.right = right;
        this.value =value;
    }
    
    public Node getLeft(){return left;}
    public Node getRight(){return right;}
    public int getValue(){return value;}
}&lt;/code&gt;&lt;/pre&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;이진 검색 트리&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;노드의 왼쪽 자식의 값이 반드시 자신의 값이하이며, 오른쪽 자식의 값은 반드시 자신의 값 이사이앋.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;데이터가 값으로 정렬된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;어떤 노드의 왼쪽 방향의 자손들은 전부 그 노드 이하의 값을 가지며 오른쪽 자손들은 모두 그 노드 이상의 값을 가진다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;룩업연산을 빠르고 간단하게 처리 할 수 있다.&lt;/p&gt;
&lt;pre id=&quot;code_1673282150777&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;Node findNode(Node root, int value){
	while(root != null){
    	int currval = root.getValue();
        if( currval == value) break;
        if( currval &amp;lt; value){
        	root = root.getRight();
        }else { // currval &amp;gt; value
        	root = root.getLeft();
        }
    }
    return root;
}&lt;/code&gt;&lt;/pre&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;힙&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;노드의 각 자식의 값은 노드 자신의 값 이하여야한다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;루트노드의 값은 그 트리에서 가장 큰 값이며 최댓값을 상수 시간으로 구하는 것이 가능하다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;삽입과 삭제는 O(log(n))&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;룩업은 O(n)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ex, 병원 응급실에서 대기 중인 환자들을 힙으로 모델링&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;h4 data-ke-size=&quot;size20&quot;&gt;일반적인 검색 방법&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;너비 우선 검색&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;O(n)&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;깊이 우선 검색&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;종주 (traversal)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;방법에 따라 노드를 방문하는 순서가 달라진다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;프리오더 종주 : 항상 노드를 자식들보다 먼저 방문&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;인오더 종주 : 왼쪽 서브트리를 먼저 방문하고 노드 자체를 방문한 다음 오른쪽 서브 트리 방문&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;포스트오더 종주 : 왼쪽자손 작업 수행 후 오른쪽자손 작업 마지막으로 그 노드 자체 처리&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;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>*/What I did today</category>
      <author>haileykim2014</author>
      <guid isPermaLink="true">https://haileykim2014.tistory.com/416</guid>
      <comments>https://haileykim2014.tistory.com/416#entry416comment</comments>
      <pubDate>Tue, 10 Jan 2023 01:36:48 +0900</pubDate>
    </item>
    <item>
      <title>null 대신 Optional 클래스</title>
      <link>https://haileykim2014.tistory.com/415</link>
      <description>&lt;h4 data-ke-size=&quot;size20&quot;&gt;null 때문에 발생하는 문제&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;에러의 근원 : NPE&lt;/li&gt;
&lt;li&gt;코드를 어지럽힌다. : 중첩된 null 확인 코드&lt;/li&gt;
&lt;li&gt;형식 시스템에 구멍을 만듦&amp;nbsp; : null이 할당되면 시스템의 다른부분으로 null이 퍼졌을때 애초에 null이 어떤 의미로 사용되었는지 알 수 없음&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Optional클래스를 사용&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;메서드의 시그니처만 보고도 선택형 값인지 여부를 구별 할 수 있다.&lt;/p&gt;
&lt;pre id=&quot;code_1672588318207&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;public class Person{
	private Optional&amp;lt;Car&amp;gt; car; //사람이 차를 소유했을 수도 소유하지 않았을 수도 있다
    public Optional&amp;lt;Car&amp;gt; getCar();{
    	return car;
        }
    }&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;Optional 사용&amp;nbsp;&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;잠재적 null이 될 수 있는 대상을 Optional로 감싸기&lt;/li&gt;
&lt;li&gt;팩토리메서드 Optional.empty , Optional.of , Optional.ofNullable 이용해서 Optional 객체 만들기&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1672588585459&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;Optional&amp;lt;Object&amp;gt; value = Optional.ofNullable(map.get)&quot;key&quot;));&lt;/code&gt;&lt;/pre&gt;</description>
      <category>*/What I did today</category>
      <author>haileykim2014</author>
      <guid isPermaLink="true">https://haileykim2014.tistory.com/415</guid>
      <comments>https://haileykim2014.tistory.com/415#entry415comment</comments>
      <pubDate>Mon, 2 Jan 2023 00:59:10 +0900</pubDate>
    </item>
    <item>
      <title>GC</title>
      <link>https://haileykim2014.tistory.com/414</link>
      <description>&lt;p&gt;&lt;figure class=&quot;fileblock&quot; data-ke-align=&quot;alignCenter&quot;&gt;&lt;a href=&quot;https://blog.kakaocdn.net/dn/cpWtjh/btrU6YTVPaG/vbDiXxGXSq6DZEH0d1tW21/Garbage-First%20Garbage%20Collector.pdf?attach=1&amp;amp;knm=tfile.pdf&quot; class=&quot;&quot;&gt;
    &lt;div class=&quot;image&quot;&gt;&lt;/div&gt;
    &lt;div class=&quot;desc&quot;&gt;&lt;div class=&quot;filename&quot;&gt;&lt;span class=&quot;name&quot;&gt;Garbage-First Garbage Collector.pdf&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;size&quot;&gt;0.33MB&lt;/div&gt;
&lt;/div&gt;
  &lt;/a&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;GC : 프로그램이 동적으로 할당했던 메모리 영역중 필요업게 된 영역을 알아서 해제&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;장점 : 메모리 누수 방지, 해제된 메모리 접근 방지, 해제한 메모리의 해제 방지&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;단점 : GC작업은 순수 오버헤드&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;GC알고리즘&lt;/h4&gt;
&lt;ol style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Reference counting
&lt;ol style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;힙영역에 선언된 객체들이 레퍼런스카운트 숫자를 갖는다.&lt;/li&gt;
&lt;li&gt;레퍼런스 카운트가 0이면 GC대상&lt;/li&gt;
&lt;li&gt;순환참조 문제발생 (메모리 릭 발생)&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;Mark and sweep
&lt;ol style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;순환 참조 문제해결&lt;/li&gt;
&lt;li&gt;루트에서부터 해당 객체에 접근가능한지 기준&lt;/li&gt;
&lt;li&gt;Mark : 루트부터 연결된 객체찾는것 (reachable)&lt;/li&gt;
&lt;li&gt;Sweep : 연결이 끊어진 객체 지우는것(unreachable)&lt;/li&gt;
&lt;li&gt;Compaction : 메모리 파편화 막음 (필수 아님)
&lt;ol style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span&gt;Sweep &lt;/span&gt;후에&lt;span&gt; &lt;/span&gt;분산된&lt;span&gt; &lt;/span&gt;객체들을&lt;span&gt; Heap&lt;/span&gt;의&lt;span&gt; &lt;/span&gt;시작&lt;span&gt; &lt;/span&gt;주소로&lt;span&gt; &lt;/span&gt;모아&lt;span&gt; &lt;/span&gt;메모리가&lt;span&gt; &lt;/span&gt;할당된&lt;span&gt; &lt;/span&gt;부분과&lt;span&gt; &lt;/span&gt;그렇지&lt;span&gt; &lt;/span&gt;않은&lt;span&gt; &lt;/span&gt;부분으로&lt;span&gt; &lt;/span&gt;압축한다&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;단점 : 의도적으로 GC실행 시켜야함, 어플리케이션과 GC실행이 병행&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;Root space&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2334&quot; data-origin-height=&quot;1168&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Htzbg/btrVeWJM1vA/nk3fEaKOPmo6wIjmHYiuCK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Htzbg/btrVeWJM1vA/nk3fEaKOPmo6wIjmHYiuCK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Htzbg/btrVeWJM1vA/nk3fEaKOPmo6wIjmHYiuCK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FHtzbg%2FbtrVeWJM1vA%2Fnk3fEaKOPmo6wIjmHYiuCK%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;508&quot; height=&quot;254&quot; data-origin-width=&quot;2334&quot; data-origin-height=&quot;1168&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;JVM메모리의 stack의 로컬변수 , method area에 저장된 static변수 , native method stack의 C/C++ 작성되 JNI참조&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;Heap :&lt;/h4&gt;
&lt;ol style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Young
&lt;ol style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Eden : minor GC&lt;/li&gt;
&lt;li&gt;Survival 0 : minor GC&lt;/li&gt;
&lt;li&gt;Survival 1 : minor GC (서바이벌0,1 둘중하나만차야함)&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;Old : (young -&amp;gt; old : promotion)
&lt;ol style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Major GC 발생&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;대부분 객체가 수명이 짧음&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;메모리의 특정부분만 처리(영부분)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Stop the world&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;GC실행을 위해 JVM이 어플리케이션 실행을 멈추는것&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;GC 방식&lt;/h4&gt;
&lt;ol style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Serial GC
&lt;ol style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;하나의 스레드로 GC실행&lt;/li&gt;
&lt;li&gt;Stw 시간이 김&lt;/li&gt;
&lt;li&gt;싱글 스레드 환경 및 heap이 매우 작을때 사용&lt;/li&gt;
&lt;li&gt;compaction&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;Parallel GC
&lt;ol style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;여러개의 스레드로 GC실행&lt;/li&gt;
&lt;li&gt;멀티코어 환경에서 사용&lt;/li&gt;
&lt;li&gt;Java8 default GC&lt;/li&gt;
&lt;li&gt;Compaction (mark-summary-compaction)&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;CMS (concurrent mark sweep)
&lt;ol style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;stw시간을 최소화하기위해 고안&lt;/li&gt;
&lt;li&gt;GC 작업을 어플리케이션과 동시에 실행&lt;/li&gt;
&lt;li&gt;G1 GC 등장에 따라 deprecated&lt;/li&gt;
&lt;li&gt;compaction이 기본적으로 제공되지않음&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;G1 GC
&lt;ol style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;heap을 region으로 나누어 관리&lt;/li&gt;
&lt;li&gt;Java9 default&lt;/li&gt;
&lt;li&gt;Compaction 작업수행&lt;/li&gt;
&lt;li&gt;Heap을 일정크기의 리전으로 잘게 나눠서 어떤영역은 올드 ,영으로 나눠서 튜닝한다.전통적인 GC 힙구조와 달리 young 이나 old 영역이 인접해 있지 않고 영역의 사이즈에 따라서 동적으로 바뀔 수 있다.&lt;/li&gt;
&lt;li&gt;&lt;span&gt;G1 GC&lt;/span&gt;는&lt;span&gt; &lt;/span&gt;영역의&lt;span&gt; &lt;/span&gt;개념이&lt;span&gt; &lt;/span&gt;물리적으로&lt;span&gt; &lt;/span&gt;존재하지&lt;span&gt; &lt;/span&gt;않고&lt;span&gt; &lt;/span&gt;논리적으로&lt;span&gt; &lt;/span&gt;존재함으로써&lt;span&gt; &lt;/span&gt;공간과&lt;span&gt; &lt;/span&gt;시간을&lt;span&gt; &lt;/span&gt;아낄&lt;span&gt; &lt;/span&gt;수&lt;span&gt; &lt;/span&gt;있다&lt;span&gt;.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;메모리가 많이 차있는 리전을 인식하는 기능을 통해 메모리가 많이 차있는 리전을 우선적으로 GC한다.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://luavis.me/server/g1-gc&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://luavis.me/server/g1-gc&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Compaction :&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;더 이상 참조되지 않는 오브젝트가 해제된 이후 오브젝트들 사이의 빈공간을 없애기 위해 재배치&lt;/li&gt;
&lt;li&gt;여유 공간을 큰 덩어리로 통합&lt;/li&gt;
&lt;li&gt;선형&lt;/li&gt;
&lt;li&gt;TLAB (스레드 로컬 할당 버퍼)&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;GC튜닝&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;올드영역 객체최소화하기&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Major GC시간 짧게&lt;/p&gt;
&lt;pre id=&quot;code_1672767575031&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;java -XX:+PrintCommandLineFlags -version
-XX:ConcGCThreads=3 -XX:G1ConcRefinementThreads=10 -XX:GCDrainStackTargetSize=64 -XX:InitialHeapSize=268435456 -XX:MarkStackSize=4194304 -XX:MaxHeapSize=4294967296 -XX:MinHeapSize=6815736 -XX:+PrintCommandLineFlags -XX:ReservedCodeCacheSize=251658240 -XX:+SegmentedCodeCache -XX:+UseCompressedClassPointers -XX:+UseCompressedOops -XX:+UseG1GC 
openjdk version &quot;18.0.2.1&quot; 2022-08-18
OpenJDK Runtime Environment (build 18.0.2.1+1-1)
OpenJDK 64-Bit Server VM (build 18.0.2.1+1-1, mixed mode, sharing)&lt;/code&gt;&lt;/pre&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;GC 종류 변화&lt;/p&gt;
&lt;ol style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Serial GC&lt;/li&gt;
&lt;li&gt;Parallel GC&lt;/li&gt;
&lt;li&gt;Parallel Old GC&lt;/li&gt;
&lt;li&gt;CMS GC&lt;/li&gt;
&lt;li&gt;G1&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;CMS GC : 메모리 단편화발생&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;G1 GC :메모리 단편화 해결&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;GC 알고리즘&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;자바 GC&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;자바 GC 실행 방법&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Jim memory leak&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Scouter&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Riverbed&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;NPM&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;CMS에서는 compaction을 직접해줘야하나 ?&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;STW는 정확히 언제 발생하는가 ?&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;G1 &lt;/span&gt;에서는&lt;span&gt; STW&lt;/span&gt;가&lt;span&gt; &lt;/span&gt;특정&lt;span&gt; &lt;/span&gt;구간에만&lt;span&gt; &lt;/span&gt;발생할&lt;span&gt; &lt;/span&gt;수&lt;span&gt; &lt;/span&gt;있는&lt;span&gt; &lt;/span&gt;이유는&lt;span&gt; ?&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;&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;1728&quot; data-origin-height=&quot;1106&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cAlmWJ/btrU56EtlXr/kT1FOMcnTmlYqKPJrqdDb0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cAlmWJ/btrU56EtlXr/kT1FOMcnTmlYqKPJrqdDb0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cAlmWJ/btrU56EtlXr/kT1FOMcnTmlYqKPJrqdDb0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcAlmWJ%2FbtrU56EtlXr%2FkT1FOMcnTmlYqKPJrqdDb0%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;1728&quot; height=&quot;1106&quot; data-origin-width=&quot;1728&quot; data-origin-height=&quot;1106&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&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2200&quot; data-origin-height=&quot;990&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cnVwzr/btrVam02kf9/vI7aJkMeGOg8uLDu226q8k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cnVwzr/btrVam02kf9/vI7aJkMeGOg8uLDu226q8k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cnVwzr/btrVam02kf9/vI7aJkMeGOg8uLDu226q8k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcnVwzr%2FbtrVam02kf9%2FvI7aJkMeGOg8uLDu226q8k%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;2200&quot; height=&quot;990&quot; data-origin-width=&quot;2200&quot; data-origin-height=&quot;990&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://mirinae312.github.io/develop/2018/06/04/jvm_gc.html&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://mirinae312.github.io/develop/2018/06/04/jvm_gc.html&lt;/a&gt; &amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://d2.naver.com/helloworld/329631&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://d2.naver.com/helloworld/329631&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://d2.naver.com/helloworld/1329&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://d2.naver.com/helloworld/1329&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;http://imp51.tistory.com/entry/G1-GC-Garbage-First-Garbage-Collector-Tuning&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;http://imp51.tistory.com/entry/G1-GC-Garbage-First-Garbage-Collector-Tuning&lt;/a&gt; &lt;a href=&quot;https://thinkground.studio/%EC%9D%BC%EB%B0%98%EC%A0%81%EC%9D%B8-gc-%EB%82%B4%EC%9A%A9%EA%B3%BC-g1gc-garbage-first-garbage-collector-%EB%82%B4%EC%9A%A9/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://thinkground.studio/%EC%9D%BC%EB%B0%98%EC%A0%81%EC%9D%B8-gc-%EB%82%B4%EC%9A%A9%EA%B3%BC-g1gc-garbage-first-garbage-collector-%EB%82%B4%EC%9A%A9/&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>*/What I did today</category>
      <author>haileykim2014</author>
      <guid isPermaLink="true">https://haileykim2014.tistory.com/414</guid>
      <comments>https://haileykim2014.tistory.com/414#entry414comment</comments>
      <pubDate>Sun, 1 Jan 2023 18:13:51 +0900</pubDate>
    </item>
    <item>
      <title>static 변수는 JVM의 어디에 저장될까 ?</title>
      <link>https://haileykim2014.tistory.com/413</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;자바 키워드부터 다시 공부하고 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;static 사용의 장단점 및 주의사항을 알게되면서 JVM메모리에는 어떻게 저장될지 궁금해서 찾아보았다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;찾아볼수록 사람마다 다른 해석을 하고 Java8에서의 변화도 알게되면서 정리하는데 오랜 시간이 걸렸다.&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;h4 data-ke-size=&quot;size20&quot;&gt;이해가 필요했던 부분들&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;static&lt;/li&gt;
&lt;li&gt;JVM 의 method area&lt;/li&gt;
&lt;li&gt;constant pool vs string constant pool&lt;/li&gt;
&lt;li&gt;Permanent Generation의 변화&amp;nbsp;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;Static 변수가 heap에서 관리되다 ?&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;static키워드를 통해 정의된 변수들은&amp;nbsp; method area내 constant pool에 reference 정보가 들어가고 value는 heap에 들어가 GC대상이 된다. 특히 String을 static으로 선언하면 heap안에 String constant pool안에 value가 저장된다. new키워드없이 바로 문자열을 대입하면 string constant pool영역에서 하나의 객체로 유지되는 것이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이는 new 키워드를 이용했을때와 다르다. static String을 new연산자를 이용하면 heap안에서 계속 새로운 객체로 인식이된다.&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;method area를 heap의 일부로 정리되어있는 글도 있는데, 포인트는 &lt;u&gt;Java8 부터 Static Oject 를 heap영역에 옮겨서 GC 대상&lt;/u&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;h4 data-ke-size=&quot;size20&quot;&gt;히스토리&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이는 Permanent Generation이 MetaSpace으로 변한 히스토리 이해가 필요했다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Class 데이터를 저장하는 곳은 method area이고 Java8이전에는 Method area를 PermGen에 할당했다. 이때 VM옵션으로 정해진 사이즈를 줬는데 이게 out of memory를 발생하게 했다. Java8 이후에는 PermGen 영역이 완전히 없어지고 Metaspace가 PermGen의 역할을 한다. &lt;span style=&quot;background-color: #ffffff; color: #24292f;&quot;&gt;permanent generation 에 저장된 정보도 GC대상이었다. 참조를 하지않는 Object를 GC대상이되록 하는데 변화가 있었던 것이다.&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;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;정리&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;지역변수가 primitive type 이면 stack에 저장된다.&lt;/li&gt;
&lt;li&gt;지역변수가 reference type 이면 객체는 heap에 저장되고 객체를 가리키는 reference는 stack에 저장된다.&lt;/li&gt;
&lt;li&gt;인스턴스 변수일 경우 primitive type 및 reference type 모두 객체는 heap에 저장되고 그 객체의 reference는 stack에 저장된다.&lt;br /&gt;클래스 변수가 primitive type이면 method area 내 runtime constant pool에 reference가 저장되고 value가 heap에 저장된다.&lt;/li&gt;
&lt;li&gt;클래스 변수가 reference type이면 heap내 객체자가 저장되고 reference를 method area내 runtime constant pool에 저장된다.&amp;nbsp;&lt;/li&gt;
&lt;li&gt;String Literal 은 Heap내 String constant pool에 저장되어 동일한 주소를 유지한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1266&quot; data-origin-height=&quot;1084&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/LHVZH/btrUxqjfoL5/UNHku1KEnT0lwsEFkpFEMK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/LHVZH/btrUxqjfoL5/UNHku1KEnT0lwsEFkpFEMK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/LHVZH/btrUxqjfoL5/UNHku1KEnT0lwsEFkpFEMK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FLHVZH%2FbtrUxqjfoL5%2FUNHku1KEnT0lwsEFkpFEMK%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;737&quot; height=&quot;631&quot; data-origin-width=&quot;1266&quot; data-origin-height=&quot;1084&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;&lt;a href=&quot;https://jgrammer.tistory.com/144&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://jgrammer.tistory.com/144&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://stackoverflow.com/questions/50163218/is-method-area-still-present-in-java-8&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://stackoverflow.com/questions/50163218/is-method-area-still-present-in-java-8&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://mirinae312.github.io/develop/2018/06/04/jvm_memory.html&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://mirinae312.github.io/develop/2018/06/04/jvm_memory.html&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://8iggy.tistory.com/230&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://8iggy.tistory.com/230&lt;/a&gt;&lt;/p&gt;</description>
      <category>*/What I did today</category>
      <author>haileykim2014</author>
      <guid isPermaLink="true">https://haileykim2014.tistory.com/413</guid>
      <comments>https://haileykim2014.tistory.com/413#entry413comment</comments>
      <pubDate>Sun, 25 Dec 2022 14:27:01 +0900</pubDate>
    </item>
    <item>
      <title>JVM</title>
      <link>https://haileykim2014.tistory.com/412</link>
      <description>&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;JVM &lt;/span&gt;&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;실행될 클래스 파일을 메모리에 로드 후 초기화 작업 수행&lt;/li&gt;
&lt;li&gt;메소드와 클래스변수들을 해당 메모리 영역에 배치&lt;/li&gt;
&lt;li&gt;클래스 로드가 끝난 후 JVM은 main메소드를 찾아 지역변수, 객체변수, 참조변수를 스택에 쌓음&lt;/li&gt;
&lt;li&gt;다음 라인을 진행하면서 상황에 맞는 작업 수행&amp;nbsp;&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;JVM은 운영체제에 독립적&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Java를 사용하려면 JDK를 설치해야하는데 JDK는 운영체제별로 종류가 다르다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;JDK안에는 JRE, API,JVM이 포함되어 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;운영체제마다 다른 JVM이 제공되어 독립적일 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;JVM 실행&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;자바 코드 (.java) 컴파일&amp;nbsp; -&amp;gt; 바이트 코드파일 생성(.class) -&amp;gt; 기계어 코드파일 변환 (JVM역할)&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;1303&quot; data-origin-height=&quot;1538&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ctji0P/btrUwoFfE3P/Y7iOL54RIRVkZ4D1KGK4y1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ctji0P/btrUwoFfE3P/Y7iOL54RIRVkZ4D1KGK4y1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ctji0P/btrUwoFfE3P/Y7iOL54RIRVkZ4D1KGK4y1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fctji0P%2FbtrUwoFfE3P%2FY7iOL54RIRVkZ4D1KGK4y1%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;479&quot; height=&quot;565&quot; data-origin-width=&quot;1303&quot; data-origin-height=&quot;1538&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. Class Loader&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;실행에 필요한 실행파일(.class)찾는다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- bootstrap classloader&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- extension classloader&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- application classloader&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;2. 바이트 코드 검증&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;3. 기계어 코드로 변환&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Java실행 파일은 바이트 코드이기 때문에 실행될때 다시 한번 기계가 읽을 수 있는 형태로 인터프리터를 통해 해석된다.&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;- JIT 컴파일러&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;Runtime Data Area&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;892&quot; data-origin-height=&quot;894&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bwXxbx/btrUBa79L3L/0xkFuvc3K0KGG75rVtOSkk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bwXxbx/btrUBa79L3L/0xkFuvc3K0KGG75rVtOSkk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bwXxbx/btrUBa79L3L/0xkFuvc3K0KGG75rVtOSkk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbwXxbx%2FbtrUBa79L3L%2F0xkFuvc3K0KGG75rVtOSkk%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;354&quot; height=&quot;355&quot; data-origin-width=&quot;892&quot; data-origin-height=&quot;894&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;런타임&lt;/span&gt; &lt;span&gt;데이터&lt;/span&gt; &lt;span&gt;영역에서&lt;/span&gt; &lt;br /&gt;&lt;span&gt;여러&lt;/span&gt; &lt;span&gt;쓰레드가&lt;/span&gt; heap, method area ( + runtime constant pool)&lt;span&gt;을&lt;/span&gt; &lt;span&gt;공유하고&lt;/span&gt;&lt;br /&gt;&lt;span&gt;각&lt;/span&gt; &lt;span&gt;쓰레드는&lt;/span&gt; PC register , stack , Native method stack&lt;span&gt;을&lt;/span&gt; &lt;span&gt;가진다&lt;/span&gt;.&lt;span&gt;&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;1. Method area&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;JVM이 읽어 들인 클래스와 인터페이스에 대한 runtime constant pool, 멤버변수, 클래스 변수, 생성자와 메소드를 저장하는 공간&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #555555;&quot;&gt;메서드 영역은 모든 스레드가 공유하는 영역으로 JVM이 시작될 때 생성된다. JVM이 읽어 들인 각각의 클래스와 인터페이스에 대한 런타임 상수 풀, 필드와 메서드 정보, Static 변수, 메서드의 바이트코드 등을 보관한다. 메서드 영역은 JVM 벤더마다 다양한 형태로 구현할 수 있으며, 오라클 핫스팟 JVM(HotSpot JVM)에서는 흔히 Permanent Area, 혹은 Permanent Generation(PermGen) 이라고 불렸는데 지금 Metaspace라고 불린다. 메서드 영역에 대한 가비지 컬렉션은 JVM 벤더의 선택 사항이다&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- JVM시작시 생성&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 프로그램 종료시 까지&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 구성 방식이나 GC방법은 JVM벤더마다 다를 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;* runtime constant pool : &lt;span style=&quot;background-color: #fdfdfd; color: #000000;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;상수 풀은 특정 클래스의 코드를 실행하는 데 필요한 상수를 포함한다. 기본적으로 심볼 테이블과 유사한 런타임 데이터 구조이다. 자바 클래스 파일에서 클래스별 또는 인터페이스별 런타임을 표현한다.&lt;span style=&quot;color: #555555;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;JVM은 클래스 파일을 로드하면서 이 constant_pool 정보를 메서드 영역의 런타임 상수 풀에 넣는다&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;클래스 파일 포맷에서 constant_pool 테이블에 해당하는 영역이다. 메서드 영역에 포함되는 영역이긴 하지만, JVM 동작에서 가장 핵심적인 역할을 수행하는 곳이기 때문에 JVM 명세에서도 따로 중요하게 기술한다. 각 클래스와 인터페이스의 상수뿐만 아니라, 메서드와 필드에 대한 모든 레퍼런스까지 담고 있는 테이블이다. 즉, 어떤 메서드나 필드를 참조할 때 JVM은 런타임 상수 풀을 통해 해당 메서드나 필드의 실제 메모리상 주소를 찾아서 참조한다.&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;2. Heap area&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;런타임시 동적으로 할당하여 사용하는 영역이다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;new연산자로 생성된 객체와 배열을 저장한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;참조하는 변수나 필드가 없다면 의미없는 객체가되어 GC대상이 된다.&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;3.Stack area&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;942&quot; data-origin-height=&quot;750&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b4fdrf/btrUE5rJ203/FgiFklQGcIR3wmucSAqCtk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b4fdrf/btrUE5rJ203/FgiFklQGcIR3wmucSAqCtk/img.png&quot; data-alt=&quot;JVM 스택안에 스택프레임 구조를 저장한다.&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b4fdrf/btrUE5rJ203/FgiFklQGcIR3wmucSAqCtk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb4fdrf%2FbtrUE5rJ203%2FFgiFklQGcIR3wmucSAqCtk%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;299&quot; height=&quot;238&quot; data-origin-width=&quot;942&quot; data-origin-height=&quot;750&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;JVM 스택안에 스택프레임 구조를 저장한다.&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;각 스레드 마다 존재한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;메소드 호출시 프레임을 추가하고 메소드가 종료되면 프레임제거하는 동작을 수행한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;후입선출&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;primitive 타입변수는 스택영역에 직접 값을 가진다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #555555;&quot;&gt;JVM 스택은 각 스레드마다 하나씩 존재하며 스레드가 시작될 때 생성된다. 스택 프레임(Stack Frame)이라는 구조체를 저장하는 스택으로, JVM은 오직 JVM 스택에 스택 프레임을 추가하고(push) 제거하는(pop) 동작만 수행한다. 예외 발생 시 printStackTrace() 등의 메서드로 보여주는 Stack Trace의 각 라인은 하나의 스택 프레임을 표현한다&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;5. PC register&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;6. Native method stack area&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;&lt;a href=&quot;https://docs.oracle.com/javase/9/docs/api/java/lang/management/MemoryMXBean.html&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://docs.oracle.com/javase/9/docs/api/java/lang/management/MemoryMXBean.html&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://goneoneill.tistory.com/43&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://goneoneill.tistory.com/43&lt;/a&gt;&lt;/p&gt;</description>
      <category>*/What I did today</category>
      <author>haileykim2014</author>
      <guid isPermaLink="true">https://haileykim2014.tistory.com/412</guid>
      <comments>https://haileykim2014.tistory.com/412#entry412comment</comments>
      <pubDate>Sat, 24 Dec 2022 03:38:46 +0900</pubDate>
    </item>
    <item>
      <title>Java - static 사용의 지양</title>
      <link>https://haileykim2014.tistory.com/411</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;static : global state&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;static 변수는 코드 여러 부분에서 영향을 받을 수 있어 변화를 추적하기가 어렵다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. static은 객체 지향 적이지 않다.&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;예를 들어 static변수를 공유하여 여러 프로그램에서 사용할때 서로의 상태에 영향을 줄 수 있다. (데이터 정합성 문제 발생)&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;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;2. 객체의 라이프 타임&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;static변수는 프로그램이 실행되고 있는 내내 살아있게 된다. 그 클래스 작업이 끝났더라도 static변수가 점유하고 있는 메모리는 garbage collector에 의해 회수되지 않는다.반대로 그 변수를 인스턴스화 해서 main()함수에서 하나의 인스턴스로 생성하고, 그 인스턴스에게 함수 호출을 시키고 그 함수 호출이 끝나면 인스턴스를 소멸된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;static은 재사용성이 떨어진다.&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;원본 :&amp;nbsp;&lt;/p&gt;
&lt;div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;i&gt;&lt;a href=&quot;http://tech.thegajago.com/2016/02/20/%EC%99%9C-%EC%9E%90%EB%B0%94%EC%97%90%EC%84%9C-static%EC%9D%98-%EC%82%AC%EC%9A%A9%EC%9D%84-%EC%A7%80%EC%96%91%ED%95%B4%EC%95%BC-%ED%95%98%EB%8A%94%EA%B0%80/&quot;&gt;http://tech.thegajago.com/2016/02/20/%EC%99%9C-%EC%9E%90%EB%B0%94%EC%97%90%EC%84%9C-static%EC%9D%98-%EC%82%AC%EC%9A%A9%EC%9D%84-%EC%A7%80%EC%96%91%ED%95%B4%EC%95%BC-%ED%95%98%EB%8A%94%EA%B0%80/&lt;/a&gt;&lt;/i&gt;&lt;/span&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>*/What I did today</category>
      <author>haileykim2014</author>
      <guid isPermaLink="true">https://haileykim2014.tistory.com/411</guid>
      <comments>https://haileykim2014.tistory.com/411#entry411comment</comments>
      <pubDate>Sat, 17 Dec 2022 23:07:53 +0900</pubDate>
    </item>
  </channel>
</rss>