<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>Happy Collin</title>
    <link>https://collinsd.tistory.com/</link>
    <description>경제 자유를 목표로 걸어가고 있습니다. </description>
    <language>ko</language>
    <pubDate>Sat, 11 Apr 2026 03:30:43 +0900</pubDate>
    <generator>TISTORY</generator>
    <ttl>100</ttl>
    <managingEditor>Collin</managingEditor>
    <image>
      <title>Happy Collin</title>
      <url>https://tistory1.daumcdn.net/tistory/2389848/attach/e9b33272b60742b58f04dc0f3f312800</url>
      <link>https://collinsd.tistory.com</link>
    </image>
    <item>
      <title>Builder 와 Record 비교</title>
      <link>https://collinsd.tistory.com/624</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #1f1f1f;&quot;&gt;자바에서 객체를 생성하고 데이터를 다루는 방식은 크게 &lt;/span&gt;&lt;span style=&quot;color: #1f1f1f;&quot;&gt;Builder 패턴&lt;/span&gt;&lt;span style=&quot;color: #1f1f1f;&quot;&gt;과 **Record(레코드)**로 나뉩니다. 두 기능은 목적과 사용 사례가 다르기 때문에 상황에 맞춰 선택하는 것이 중요합니다.&lt;/span&gt;&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;color: #1f1f1f;&quot;&gt;1. Builder 패턴 (Lombok @Builder)&lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #1f1f1f;&quot;&gt;Builder 패턴은 &lt;/span&gt;&lt;span style=&quot;color: #1f1f1f;&quot;&gt;복잡한 객체를 안전하고 편리하게 생성&lt;/span&gt;&lt;span style=&quot;color: #1f1f1f;&quot;&gt;하기 위해 사용됩니다. 주로 계층이 있고 필드가 많은 클래스에 적합합니다.&lt;/span&gt;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;color: #1f1f1f;&quot;&gt;특징&lt;/span&gt;&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li style=&quot;list-style-type: disc; color: #000000;&quot;&gt;&lt;span style=&quot;color: #1f1f1f;&quot;&gt;가독성:&lt;/span&gt;&lt;span style=&quot;color: #1f1f1f;&quot;&gt; 필드가 많을 때 어떤 값이 어떤 필드에 들어가는지 명확히 알 수 있습니다.&lt;/span&gt;&lt;/li&gt;
&lt;li style=&quot;list-style-type: disc; color: #000000;&quot;&gt;&lt;span style=&quot;color: #1f1f1f;&quot;&gt;선택적 매개변수:&lt;/span&gt;&lt;span style=&quot;color: #1f1f1f;&quot;&gt; 모든 필드를 채울 필요 없이 필요한 값만 세팅할 수 있습니다.&lt;/span&gt;&lt;/li&gt;
&lt;li style=&quot;list-style-type: disc; color: #000000;&quot;&gt;&lt;span style=&quot;color: #1f1f1f;&quot;&gt;불변성 유지:&lt;/span&gt;&lt;span style=&quot;color: #1f1f1f;&quot;&gt; 객체 생성 후 값을 바꿀 수 없도록(Setter 없음) 설계하기 좋습니다.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;color: #1f1f1f;&quot;&gt;코드 예시&lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&amp;nbsp;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #f0f4f9; color: #444746;&quot;&gt;Java&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;br /&gt;&lt;br /&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #f0f4f9; color: #1967d2;&quot;&gt;@Builder&lt;/span&gt;&lt;span style=&quot;background-color: #f0f4f9; color: #1f1f1f;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;background-color: #f0f4f9; color: #1967d2;&quot;&gt;@Getter&lt;/span&gt;&lt;span style=&quot;background-color: #f0f4f9; color: #1f1f1f;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;background-color: #f0f4f9; color: #8430ce;&quot;&gt;public&lt;/span&gt;&lt;span style=&quot;background-color: #f0f4f9; color: #1f1f1f;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;background-color: #f0f4f9; color: #8430ce;&quot;&gt;class&lt;/span&gt;&lt;span style=&quot;background-color: #f0f4f9; color: #1f1f1f;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;background-color: #f0f4f9; color: #996900;&quot;&gt;User&lt;/span&gt;&lt;span style=&quot;background-color: #f0f4f9; color: #1f1f1f;&quot;&gt; {&lt;/span&gt;&lt;span style=&quot;background-color: #f0f4f9; color: #1f1f1f;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;background-color: #f0f4f9; color: #1f1f1f;&quot;&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;background-color: #f0f4f9; color: #8430ce;&quot;&gt;private&lt;/span&gt;&lt;span style=&quot;background-color: #f0f4f9; color: #1f1f1f;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;background-color: #f0f4f9; color: #8430ce;&quot;&gt;final&lt;/span&gt;&lt;span style=&quot;background-color: #f0f4f9; color: #1f1f1f;&quot;&gt; String name;&lt;/span&gt;&lt;span style=&quot;background-color: #f0f4f9; color: #1f1f1f;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;background-color: #f0f4f9; color: #1f1f1f;&quot;&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;background-color: #f0f4f9; color: #8430ce;&quot;&gt;private&lt;/span&gt;&lt;span style=&quot;background-color: #f0f4f9; color: #1f1f1f;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;background-color: #f0f4f9; color: #8430ce;&quot;&gt;final&lt;/span&gt;&lt;span style=&quot;background-color: #f0f4f9; color: #1f1f1f;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;background-color: #f0f4f9; color: #8430ce;&quot;&gt;int&lt;/span&gt;&lt;span style=&quot;background-color: #f0f4f9; color: #1f1f1f;&quot;&gt; age;&lt;/span&gt;&lt;span style=&quot;background-color: #f0f4f9; color: #1f1f1f;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;background-color: #f0f4f9; color: #1f1f1f;&quot;&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;background-color: #f0f4f9; color: #8430ce;&quot;&gt;private&lt;/span&gt;&lt;span style=&quot;background-color: #f0f4f9; color: #1f1f1f;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;background-color: #f0f4f9; color: #8430ce;&quot;&gt;final&lt;/span&gt;&lt;span style=&quot;background-color: #f0f4f9; color: #1f1f1f;&quot;&gt; String email;&lt;/span&gt;&lt;span style=&quot;background-color: #f0f4f9; color: #1f1f1f;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;background-color: #f0f4f9; color: #1f1f1f;&quot;&gt;}&lt;/span&gt;&lt;span style=&quot;background-color: #f0f4f9; color: #1f1f1f;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;background-color: #f0f4f9; color: #1f1f1f;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;background-color: #f0f4f9; color: #5f6368;&quot;&gt;// 사용 예시&lt;/span&gt;&lt;span style=&quot;background-color: #f0f4f9; color: #1f1f1f;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;background-color: #f0f4f9; color: #1f1f1f;&quot;&gt;User user = User.builder()&lt;/span&gt;&lt;span style=&quot;background-color: #f0f4f9; color: #1f1f1f;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;background-color: #f0f4f9; color: #1f1f1f;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; .name(&lt;/span&gt;&lt;span style=&quot;background-color: #f0f4f9; color: #188038;&quot;&gt;&quot;홍길동&quot;&lt;/span&gt;&lt;span style=&quot;background-color: #f0f4f9; color: #1f1f1f;&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;background-color: #f0f4f9; color: #1f1f1f;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;background-color: #f0f4f9; color: #1f1f1f;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; .age(&lt;/span&gt;&lt;span style=&quot;background-color: #f0f4f9; color: #b55908;&quot;&gt;30&lt;/span&gt;&lt;span style=&quot;background-color: #f0f4f9; color: #1f1f1f;&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;background-color: #f0f4f9; color: #1f1f1f;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;background-color: #f0f4f9; color: #1f1f1f;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;background-color: #f0f4f9; color: #5f6368;&quot;&gt;// email은 생략 가능&lt;/span&gt;&lt;span style=&quot;background-color: #f0f4f9; color: #1f1f1f;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;background-color: #f0f4f9; color: #1f1f1f;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; .build();&lt;/span&gt;&lt;span style=&quot;background-color: #f0f4f9; color: #1f1f1f;&quot;&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;color: #1f1f1f;&quot;&gt;2. Record (자바 14 이상)&lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #1f1f1f;&quot;&gt;Record는 **&quot;순수하게 데이터 전달만을 위한 객체(DTO)&quot;**를 위해 도입된 새로운 클래스 타입입니다.&lt;/span&gt;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;color: #1f1f1f;&quot;&gt;특징&lt;/span&gt;&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li style=&quot;list-style-type: disc; color: #000000;&quot;&gt;&lt;span style=&quot;color: #1f1f1f;&quot;&gt;간결함:&lt;/span&gt;&lt;span style=&quot;color: #1f1f1f;&quot;&gt; 클래스 선언 한 줄로 Constructor, Getter, equals, hashCode, toString이 자동 생성됩니다.&lt;/span&gt;&lt;/li&gt;
&lt;li style=&quot;list-style-type: disc; color: #000000;&quot;&gt;&lt;span style=&quot;color: #1f1f1f;&quot;&gt;불변 객체:&lt;/span&gt;&lt;span style=&quot;color: #1f1f1f;&quot;&gt; 모든 필드가 private final로 선언되며, 수정이 불가능합니다.&lt;/span&gt;&lt;/li&gt;
&lt;li style=&quot;list-style-type: disc; color: #000000;&quot;&gt;&lt;span style=&quot;color: #1f1f1f;&quot;&gt;상속 불가:&lt;/span&gt;&lt;span style=&quot;color: #1f1f1f;&quot;&gt; 다른 클래스를 상속받을 수 없습니다. (인터페이스 구현은 가능)&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;color: #1f1f1f;&quot;&gt;코드 예시&lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&amp;nbsp;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #f0f4f9; color: #444746;&quot;&gt;Java&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;br /&gt;&lt;br /&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #f0f4f9; color: #8430ce;&quot;&gt;public&lt;/span&gt;&lt;span style=&quot;background-color: #f0f4f9; color: #444746;&quot;&gt; record &lt;/span&gt;&lt;span style=&quot;background-color: #f0f4f9; color: #996900;&quot;&gt;UserRecord&lt;/span&gt;&lt;span style=&quot;background-color: #f0f4f9; color: #444746;&quot;&gt;(String name, &lt;/span&gt;&lt;span style=&quot;background-color: #f0f4f9; color: #8430ce;&quot;&gt;int&lt;/span&gt;&lt;span style=&quot;background-color: #f0f4f9; color: #444746;&quot;&gt; age, String email) &lt;/span&gt;&lt;span style=&quot;background-color: #f0f4f9; color: #1f1f1f;&quot;&gt;{}&lt;/span&gt;&lt;span style=&quot;background-color: #f0f4f9; color: #1f1f1f;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;background-color: #f0f4f9; color: #1f1f1f;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;background-color: #f0f4f9; color: #5f6368;&quot;&gt;// 사용 예시&lt;/span&gt;&lt;span style=&quot;background-color: #f0f4f9; color: #1f1f1f;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;background-color: #f0f4f9; color: #1f1f1f;&quot;&gt;UserRecord user = &lt;/span&gt;&lt;span style=&quot;background-color: #f0f4f9; color: #8430ce;&quot;&gt;new&lt;/span&gt;&lt;span style=&quot;background-color: #f0f4f9; color: #1f1f1f;&quot;&gt; UserRecord(&lt;/span&gt;&lt;span style=&quot;background-color: #f0f4f9; color: #188038;&quot;&gt;&quot;이순신&quot;&lt;/span&gt;&lt;span style=&quot;background-color: #f0f4f9; color: #1f1f1f;&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;background-color: #f0f4f9; color: #b55908;&quot;&gt;40&lt;/span&gt;&lt;span style=&quot;background-color: #f0f4f9; color: #1f1f1f;&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;background-color: #f0f4f9; color: #188038;&quot;&gt;&quot;lee@test.com&quot;&lt;/span&gt;&lt;span style=&quot;background-color: #f0f4f9; color: #1f1f1f;&quot;&gt;);&lt;/span&gt;&lt;span style=&quot;background-color: #f0f4f9; color: #1f1f1f;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;background-color: #f0f4f9; color: #1f1f1f;&quot;&gt;System.out.println(user.name()); &lt;/span&gt;&lt;span style=&quot;background-color: #f0f4f9; color: #5f6368;&quot;&gt;// get이 아닌 필드명으로 호출&lt;/span&gt;&lt;span style=&quot;background-color: #f0f4f9; color: #1f1f1f;&quot;&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;color: #1f1f1f;&quot;&gt;3. Builder vs Record 핵심 비교&lt;/span&gt;&lt;/h2&gt;
&lt;div&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;&lt;span style=&quot;color: #1f1f1f;&quot;&gt;구분&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;&lt;span style=&quot;color: #1f1f1f;&quot;&gt;Builder 패턴 (Lombok)&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;&lt;span style=&quot;color: #1f1f1f;&quot;&gt;Record (Java Standard)&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;&lt;span style=&quot;color: #1f1f1f;&quot;&gt;주요 목적&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;&lt;span style=&quot;color: #1f1f1f;&quot;&gt;객체 생성의 편의성 및 가독성&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;&lt;span style=&quot;color: #1f1f1f;&quot;&gt;데이터 전달용(DTO) 객체의 간결함&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;&lt;span style=&quot;color: #1f1f1f;&quot;&gt;가변성&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;&lt;span style=&quot;color: #1f1f1f;&quot;&gt;가변/불변 선택 가능&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;&lt;span style=&quot;color: #1f1f1f;&quot;&gt;무조건 불변&lt;/span&gt;&lt;span style=&quot;color: #1f1f1f;&quot;&gt; (Immutable)&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;&lt;span style=&quot;color: #1f1f1f;&quot;&gt;생성 방식&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;&lt;span style=&quot;color: #1f1f1f;&quot;&gt;체이닝 방식 (.name().age())&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;&lt;span style=&quot;color: #1f1f1f;&quot;&gt;생성자 방식 (new Record(...))&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;&lt;span style=&quot;color: #1f1f1f;&quot;&gt;코드 양&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;&lt;span style=&quot;color: #1f1f1f;&quot;&gt;@Builder 등 어노테이션 필요&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;&lt;span style=&quot;color: #1f1f1f;&quot;&gt;키워드 하나로 모든 메서드 자동 생성&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;&lt;span style=&quot;color: #1f1f1f;&quot;&gt;필드 개수&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;&lt;span style=&quot;color: #1f1f1f;&quot;&gt;필드가 많을수록 유리함&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;&lt;span style=&quot;color: #1f1f1f;&quot;&gt;필드가 많으면 생성자 파라미터가 길어짐&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;color: #1f1f1f;&quot;&gt;4. 언제 무엇을 써야 할까요?&lt;/span&gt;&lt;/h2&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;color: #1f1f1f;&quot;&gt;Builder를 써야 할 때&lt;/span&gt;&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li style=&quot;list-style-type: disc; color: #000000;&quot;&gt;&lt;span style=&quot;color: #1f1f1f;&quot;&gt;생성자 파라미터가 5개 이상으로 많을 때&lt;/span&gt;&lt;/li&gt;
&lt;li style=&quot;list-style-type: disc; color: #000000;&quot;&gt;&lt;span style=&quot;color: #1f1f1f;&quot;&gt;객체 생성 시 필수 값과 선택 값이 나뉘어 있을 때&lt;/span&gt;&lt;/li&gt;
&lt;li style=&quot;list-style-type: disc; color: #000000;&quot;&gt;&lt;span style=&quot;color: #1f1f1f;&quot;&gt;이미 정의된 클래스(Entity 등)를 불변으로 만들고 싶을 때&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;color: #1f1f1f;&quot;&gt;Record를 써야 할 때&lt;/span&gt;&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li style=&quot;list-style-type: disc; color: #000000;&quot;&gt;&lt;span style=&quot;color: #1f1f1f;&quot;&gt;API 응답/요청을 위한 &lt;/span&gt;&lt;span style=&quot;color: #1f1f1f;&quot;&gt;DTO&lt;/span&gt;&lt;span style=&quot;color: #1f1f1f;&quot;&gt;를 만들 때&lt;/span&gt;&lt;/li&gt;
&lt;li style=&quot;list-style-type: disc; color: #000000;&quot;&gt;&lt;span style=&quot;color: #1f1f1f;&quot;&gt;단순히 데이터를 담아서 전달하는 목적일 때&lt;/span&gt;&lt;/li&gt;
&lt;li style=&quot;list-style-type: disc; color: #000000;&quot;&gt;&lt;span style=&quot;color: #1f1f1f;&quot;&gt;자바 표준 기능만 사용하여 코드를 간결하게 유지하고 싶을 때&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;color: #1f1f1f;&quot;&gt;  꿀팁: Record와 Builder 함께 쓰기&lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #1f1f1f;&quot;&gt;최근에는 &lt;/span&gt;&lt;span style=&quot;color: #1f1f1f;&quot;&gt;Record에 @Builder를 붙여서&lt;/span&gt;&lt;span style=&quot;color: #1f1f1f;&quot;&gt; 사용하는 방식이 가장 인기가 많습니다. Record의 간결함과 Builder의 생성 편의성을 모두 챙길 수 있기 때문입니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&amp;nbsp;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #f0f4f9; color: #444746;&quot;&gt;Java&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #f0f4f9; color: #1967d2;&quot;&gt;@Builder&lt;/span&gt;&lt;span style=&quot;background-color: #f0f4f9; color: #1f1f1f;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;background-color: #f0f4f9; color: #8430ce;&quot;&gt;public&lt;/span&gt;&lt;span style=&quot;background-color: #f0f4f9; color: #444746;&quot;&gt; record &lt;/span&gt;&lt;span style=&quot;background-color: #f0f4f9; color: #996900;&quot;&gt;UserDto&lt;/span&gt;&lt;span style=&quot;background-color: #f0f4f9; color: #444746;&quot;&gt;(String name, &lt;/span&gt;&lt;span style=&quot;background-color: #f0f4f9; color: #8430ce;&quot;&gt;int&lt;/span&gt;&lt;span style=&quot;background-color: #f0f4f9; color: #444746;&quot;&gt; age, String email) &lt;/span&gt;&lt;span style=&quot;background-color: #f0f4f9; color: #1f1f1f;&quot;&gt;{}&lt;/span&gt;&lt;span style=&quot;background-color: #f0f4f9; color: #1f1f1f;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;background-color: #f0f4f9; color: #1f1f1f;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;background-color: #f0f4f9; color: #5f6368;&quot;&gt;// 사용 시&lt;/span&gt;&lt;span style=&quot;background-color: #f0f4f9; color: #1f1f1f;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;background-color: #f0f4f9; color: #1f1f1f;&quot;&gt;UserDto dto = UserDto.builder().name(&lt;/span&gt;&lt;span style=&quot;background-color: #f0f4f9; color: #188038;&quot;&gt;&quot;김철수&quot;&lt;/span&gt;&lt;span style=&quot;background-color: #f0f4f9; color: #1f1f1f;&quot;&gt;).build();&lt;/span&gt;&lt;span style=&quot;background-color: #f0f4f9; color: #1f1f1f;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color: #1f1f1f;&quot;&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>IT/프로그래밍</category>
      <category>builder</category>
      <category>record</category>
      <author>Collin</author>
      <guid isPermaLink="true">https://collinsd.tistory.com/624</guid>
      <comments>https://collinsd.tistory.com/624#entry624comment</comments>
      <pubDate>Sun, 29 Mar 2026 08:00:19 +0900</pubDate>
    </item>
    <item>
      <title>Filter ,Interceptor , AOP</title>
      <link>https://collinsd.tistory.com/623</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #1f1f1f;&quot;&gt;Spring Boot에서 클라이언트의 요청이 비즈니스 로직(Service)에 도달하기까지의 흐름은 계층별로 명확히 구분됩니다. 요청은 외곽(Servlet Container)에서 시작하여 중심(AOP)으로 들어가는 구조입니다.&lt;/span&gt;&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;color: #1f1f1f;&quot;&gt;1. 요청 처리 흐름 도식화&lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #1f1f1f;&quot;&gt;클라이언트의 요청이 들어오고 나가는 전체적인 흐름은 아래와 같습니다.&lt;/span&gt;&lt;/p&gt;
&lt;div&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;&lt;span style=&quot;color: #1f1f1f;&quot;&gt;순서&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;&lt;span style=&quot;color: #1f1f1f;&quot;&gt;구성 요소&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;&lt;span style=&quot;color: #1f1f1f;&quot;&gt;소속 레이어&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;&lt;span style=&quot;color: #1f1f1f;&quot;&gt;특징&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;&lt;span style=&quot;color: #1f1f1f;&quot;&gt;1&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;&lt;span style=&quot;color: #1f1f1f;&quot;&gt;Filter (필터)&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;&lt;span style=&quot;color: #1f1f1f;&quot;&gt;Web Container&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;&lt;span style=&quot;color: #1f1f1f;&quot;&gt;DispatcherServlet 도달 전/후 동작&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;&lt;span style=&quot;color: #1f1f1f;&quot;&gt;2&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;&lt;span style=&quot;color: #1f1f1f;&quot;&gt;Interceptor (인터셉터)&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;&lt;span style=&quot;color: #1f1f1f;&quot;&gt;Spring Context&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;&lt;span style=&quot;color: #1f1f1f;&quot;&gt;DispatcherServlet과 Controller 사이 동작&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;&lt;span style=&quot;color: #1f1f1f;&quot;&gt;3&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;&lt;span style=&quot;color: #1f1f1f;&quot;&gt;AOP (Aspect)&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;&lt;span style=&quot;color: #1f1f1f;&quot;&gt;Spring Context&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;&lt;span style=&quot;color: #1f1f1f;&quot;&gt;Proxy를 통해 비즈니스 로직 전/후 동작&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;color: #1f1f1f;&quot;&gt;2. 단계별 상세 비교 표&lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #1f1f1f;&quot;&gt;각 기술이 실행되는 시점과 주요 목적을 정리한 표입니다.&lt;/span&gt;&lt;/p&gt;
&lt;div&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;&lt;span style=&quot;color: #1f1f1f;&quot;&gt;구분&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;&lt;span style=&quot;color: #1f1f1f;&quot;&gt;Filter (필터)&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;&lt;span style=&quot;color: #1f1f1f;&quot;&gt;Interceptor (인터셉터)&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;&lt;span style=&quot;color: #1f1f1f;&quot;&gt;AOP (Aspect)&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;&lt;span style=&quot;color: #1f1f1f;&quot;&gt;관리 주체&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;&lt;span style=&quot;color: #1f1f1f;&quot;&gt;서블릿 컨테이너 (Tomcat 등)&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;&lt;span style=&quot;color: #1f1f1f;&quot;&gt;스프링 컨테이너&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;&lt;span style=&quot;color: #1f1f1f;&quot;&gt;스프링 컨테이너&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;&lt;span style=&quot;color: #1f1f1f;&quot;&gt;실행 시점&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;&lt;span style=&quot;color: #1f1f1f;&quot;&gt;HTTP 요청 최전방 / 최후방&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;&lt;span style=&quot;color: #1f1f1f;&quot;&gt;컨트롤러 호출 전/후&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;&lt;span style=&quot;color: #1f1f1f;&quot;&gt;메서드 호출 전/후 (주로 Service 레이어)&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;&lt;span style=&quot;color: #1f1f1f;&quot;&gt;접근 정보&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;&lt;span style=&quot;color: #1f1f1f;&quot;&gt;Request, Response (Low-level)&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;&lt;span style=&quot;color: #1f1f1f;&quot;&gt;HttpServletRequest, Handler 등&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;&lt;span style=&quot;color: #1f1f1f;&quot;&gt;메서드 파라미터, 반환값 등&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;&lt;span style=&quot;color: #1f1f1f;&quot;&gt;주요 역할&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;&lt;span style=&quot;color: #1f1f1f;&quot;&gt;인코딩, 보안(XSS), 로깅, 인증&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;&lt;span style=&quot;color: #1f1f1f;&quot;&gt;로그인 체크, 권한 관리, 컨트롤러 공통 데이터&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;&lt;span style=&quot;color: #1f1f1f;&quot;&gt;로깅, 트랜잭션(@Transactional), 성능 측정&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;&lt;span style=&quot;color: #1f1f1f;&quot;&gt;예외 처리&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;&lt;span style=&quot;color: #1f1f1f;&quot;&gt;서블릿 내에서 처리 불가&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;&lt;span style=&quot;color: #1f1f1f;&quot;&gt;컨트롤러 예외 처리 가능&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;&lt;span style=&quot;color: #1f1f1f;&quot;&gt;비즈니스 로직 예외 처리 최적화&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;color: #1f1f1f;&quot;&gt;3. 요약 및 흐름 이해&lt;/span&gt;&lt;/h2&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li style=&quot;list-style-type: decimal; color: #000000;&quot;&gt;&lt;span style=&quot;color: #1f1f1f;&quot;&gt;Filter:&lt;/span&gt;&lt;span style=&quot;color: #1f1f1f;&quot;&gt; 스프링 프레임워크와는 무관한 웹 애플리케이션의 공통 기능입니다. 주로 &lt;/span&gt;&lt;span style=&quot;color: #1f1f1f;&quot;&gt;전역적인 보안&lt;/span&gt;&lt;span style=&quot;color: #1f1f1f;&quot;&gt;이나 &lt;/span&gt;&lt;span style=&quot;color: #1f1f1f;&quot;&gt;데이터 압축&lt;/span&gt;&lt;span style=&quot;color: #1f1f1f;&quot;&gt;을 처리합니다.&lt;/span&gt;&lt;/li&gt;
&lt;li style=&quot;list-style-type: decimal; color: #000000;&quot;&gt;&lt;span style=&quot;color: #1f1f1f;&quot;&gt;Interceptor:&lt;/span&gt;&lt;span style=&quot;color: #1f1f1f;&quot;&gt; 스프링 내부로 들어온 후, 컨트롤러가 실행되기 전후에 처리됩니다. &lt;/span&gt;&lt;span style=&quot;color: #1f1f1f;&quot;&gt;Spring MVC 구조&lt;/span&gt;&lt;span style=&quot;color: #1f1f1f;&quot;&gt;에 특화되어 있으며, 로그인 여부 확인 등에 주로 쓰입니다.&lt;/span&gt;&lt;/li&gt;
&lt;li style=&quot;list-style-type: decimal; color: #000000;&quot;&gt;&lt;span style=&quot;color: #1f1f1f;&quot;&gt;AOP:&lt;/span&gt;&lt;span style=&quot;color: #1f1f1f;&quot;&gt; 객체 지향 프로그래밍(OOP)을 보완하기 위해 만들어졌습니다. 주로 &lt;/span&gt;&lt;span style=&quot;color: #1f1f1f;&quot;&gt;비즈니스 로직(Service)&lt;/span&gt;&lt;span style=&quot;color: #1f1f1f;&quot;&gt; 단위에서 중복되는 코드(트랜잭션 관리 등)를 분리하는 데 최적화되어 있습니다.&lt;/span&gt;&lt;span style=&quot;color: #1f1f1f;&quot;&gt;&lt;/span&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>IT/프로그래밍</category>
      <category>AOP</category>
      <category>Filter</category>
      <category>Interceptor</category>
      <author>Collin</author>
      <guid isPermaLink="true">https://collinsd.tistory.com/623</guid>
      <comments>https://collinsd.tistory.com/623#entry623comment</comments>
      <pubDate>Sat, 28 Mar 2026 07:00:39 +0900</pubDate>
    </item>
    <item>
      <title>산소미포함 씨근풀 냉각 정리</title>
      <link>https://collinsd.tistory.com/622</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h1&gt;&amp;nbsp;산소 미포함(Oxygen Not Included)에서 씨근풀 냉각 효율&lt;/h1&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;산소 미포함에서 초중반 온도 관리는 생존에 직결되는 중요한 요소입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그중 **씨근풀(Weezewort)**은 전력 없이 작동하는 식물형 냉각 장치로, 많은 플레이어들이 애용합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그런데 왜 씨근풀은 &lt;b&gt;수소 환경에서 가장 효율적&lt;/b&gt;일까요? 그 이유는 바로 **비열(Specific Heat Capacity)**에 있습니다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;  씨근풀의 냉각 메커니즘&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;씨근풀은 &lt;b&gt;아래 칸의 기체 1000g을 흡입&lt;/b&gt;한 뒤,&lt;/li&gt;
&lt;li&gt;그 기체를 &lt;b&gt;정확히 5℃ 낮춰서 위 칸으로 배출&lt;/b&gt;합니다.&lt;/li&gt;
&lt;li&gt;따라서 어떤 기체를 흡입하느냐에 따라 **냉각되는 열량(Heat Deletion)**이 달라집니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt; ️ 비열(Specific Heat Capacity)란?&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;비열&lt;/b&gt;은 물질 1kg의 온도를 1℃ 올리는 데 필요한 열량을 의미합니다.&lt;/li&gt;
&lt;li&gt;공식:&lt;br /&gt;[ Q = m \cdot c \cdot \Delta T ]
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;(Q): 제거된 열량 (J)&lt;/li&gt;
&lt;li&gt;(m): 질량 (kg)&lt;/li&gt;
&lt;li&gt;(c): 비열 (J/(kg&amp;middot;K))&lt;/li&gt;
&lt;li&gt;(\Delta T): 온도 변화 (K 또는 ℃)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;  &lt;b&gt;비열이 클수록 같은 온도 변화를 줄 때 더 많은 열을 제거&lt;/b&gt;할 수 있습니다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;  기체별 비열과 씨근풀 냉각량 비교&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;기체 비열 (J/kg&amp;middot;K) 5℃ 냉각 시 제거 열량 (J) 특징&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;수소 (H₂)&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;&amp;asymp; 2400&lt;/td&gt;
&lt;td&gt;12,000&lt;/td&gt;
&lt;td&gt;가장 효율적, 냉각실에 최적&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;산소 (O₂)&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;&amp;asymp; 1000&lt;/td&gt;
&lt;td&gt;5,000&lt;/td&gt;
&lt;td&gt;기본 환경에서 무난&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;오염된 산소 (Polluted O₂)&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;&amp;asymp; 1010&lt;/td&gt;
&lt;td&gt;5,050&lt;/td&gt;
&lt;td&gt;산소와 거의 동일&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;이산화탄소 (CO₂)&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;&amp;asymp; 850&lt;/td&gt;
&lt;td&gt;4,250&lt;/td&gt;
&lt;td&gt;효율 낮음&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;염소 (Cl₂)&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;&amp;asymp; 480&lt;/td&gt;
&lt;td&gt;2,400&lt;/td&gt;
&lt;td&gt;냉각 효율 거의 없음&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;증기 (Steam)&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;&amp;asymp; 2000&lt;/td&gt;
&lt;td&gt;10,000&lt;/td&gt;
&lt;td&gt;효율 좋지만 관리 어려움&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;  왜 수소가 최적일까?&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;씨근풀은 &lt;b&gt;온도를 5℃ 낮추는 고정 효과&lt;/b&gt;를 가지므로,&lt;/li&gt;
&lt;li&gt;비열이 큰 기체일수록 &lt;b&gt;냉각되는 총 열량이 많아집니다.&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;수소는 비열이 가장 크기 때문에, 같은 씨근풀로도 &lt;b&gt;2~5배 더 많은 열을 제거&lt;/b&gt;할 수 있습니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;⚙️ 씨근풀 냉각 조건 &amp;amp; 활용 팁&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;밀폐된 방&lt;/b&gt;을 만들고 내부를 &lt;b&gt;수소로 채운 뒤 씨근풀을 심기&lt;/b&gt; &amp;rarr; 최대 효율 달성&lt;/li&gt;
&lt;li&gt;&lt;b&gt;인광석(Phosphorite) 자동 공급&lt;/b&gt; &amp;rarr; 관리 부담 최소화&lt;/li&gt;
&lt;li&gt;&lt;b&gt;작물 보호&lt;/b&gt;: 끼니나무(Mealwood) 같은 작물의 생장 온도를 안정적으로 유지 가능&lt;/li&gt;
&lt;li&gt;&lt;b&gt;한계&lt;/b&gt;: 액체 냉각에는 비효율적 &amp;rarr; 후반에는 &lt;b&gt;액체조화기 + 증기터빈&lt;/b&gt; 같은 고급 장치로 대체&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;✅ 결론&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;씨근풀은 초중반 온도 관리에 매우 유용한 식물형 냉각 장치입니다.&lt;br /&gt;특히 &lt;b&gt;수소 환경에서 비열이 크기 때문에 같은 5℃ 냉각으로 더 많은 열을 제거할 수 있어 최적의 효율&lt;/b&gt;을 발휘합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>게임/스팀게임</category>
      <category>냉각</category>
      <category>산소미포함</category>
      <category>씨근풀</category>
      <author>Collin</author>
      <guid isPermaLink="true">https://collinsd.tistory.com/622</guid>
      <comments>https://collinsd.tistory.com/622#entry622comment</comments>
      <pubDate>Fri, 20 Feb 2026 08:00:57 +0900</pubDate>
    </item>
    <item>
      <title>[JPA/Hibernate] IN 절 파라미터 패딩(Parameter Padding)</title>
      <link>https://collinsd.tistory.com/621</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;JPA를&amp;nbsp;사용하다&amp;nbsp;보면&amp;nbsp;로그에&amp;nbsp;실제&amp;nbsp;전달한&amp;nbsp;리스트는&amp;nbsp;152개인데,&amp;nbsp;SQL&amp;nbsp;바인딩&amp;nbsp;시점에는&amp;nbsp;255개(혹은&amp;nbsp;256개)까지&amp;nbsp;늘어나&amp;nbsp;마지막&amp;nbsp;값이&amp;nbsp;반복해서&amp;nbsp;들어가는&amp;nbsp;현상을&amp;nbsp;볼&amp;nbsp;수&amp;nbsp;있습니다.&amp;nbsp;이는&amp;nbsp;`type.descriptor.sql.BasicBinder`가&amp;nbsp;수행하는&amp;nbsp;IN&amp;nbsp;Clause&amp;nbsp;Parameter&amp;nbsp;Padding&amp;nbsp;때문입니다. &lt;br /&gt;&lt;br /&gt;이&amp;nbsp;현상의&amp;nbsp;원인과&amp;nbsp;해결&amp;nbsp;방법을&amp;nbsp;정리합니다. &lt;br /&gt;&lt;br /&gt;--- &lt;br /&gt;&lt;br /&gt;&amp;nbsp;1.&amp;nbsp;왜&amp;nbsp;255개까지&amp;nbsp;늘어나는&amp;nbsp;걸까?&amp;nbsp;(원인) &lt;br /&gt;&lt;br /&gt;Hibernate는&amp;nbsp;성능&amp;nbsp;최적화를&amp;nbsp;위해&amp;nbsp;IN&amp;nbsp;절에&amp;nbsp;전달된&amp;nbsp;인자의&amp;nbsp;개수를&amp;nbsp;2의&amp;nbsp;거듭제곱(2,&amp;nbsp;4,&amp;nbsp;8,&amp;nbsp;16&amp;nbsp;...&amp;nbsp;256)&amp;nbsp;단위로&amp;nbsp;맞추는&amp;nbsp;패딩&amp;nbsp;전략을&amp;nbsp;사용합니다. &lt;br /&gt;&lt;br /&gt;*&amp;nbsp;이유:&amp;nbsp;DB의&amp;nbsp;Execution&amp;nbsp;Plan(실행&amp;nbsp;계획)&amp;nbsp;재사용성&amp;nbsp;때문입니다. &lt;br /&gt;*&amp;nbsp;상세:&amp;nbsp;인자&amp;nbsp;개수가&amp;nbsp;152개일&amp;nbsp;때와&amp;nbsp;153개일&amp;nbsp;때&amp;nbsp;각각&amp;nbsp;다른&amp;nbsp;SQL로&amp;nbsp;인식되면&amp;nbsp;DB는&amp;nbsp;매번&amp;nbsp;새로운&amp;nbsp;실행&amp;nbsp;계획을&amp;nbsp;짜야&amp;nbsp;합니다.&amp;nbsp;패딩을&amp;nbsp;통해&amp;nbsp;둘&amp;nbsp;다&amp;nbsp;256개짜리&amp;nbsp;쿼리로&amp;nbsp;통일하면,&amp;nbsp;DB는&amp;nbsp;이미&amp;nbsp;캐싱된&amp;nbsp;실행&amp;nbsp;계획을&amp;nbsp;재사용하여&amp;nbsp;CPU&amp;nbsp;소모를&amp;nbsp;줄일&amp;nbsp;수&amp;nbsp;있습니다. &lt;br /&gt;&lt;br /&gt;--- &lt;br /&gt;&lt;br /&gt;&amp;nbsp;2.&amp;nbsp;패딩을&amp;nbsp;방지하거나&amp;nbsp;조절하는&amp;nbsp;방법 &lt;br /&gt;&lt;br /&gt;상황에&amp;nbsp;따라&amp;nbsp;아래&amp;nbsp;세&amp;nbsp;가지&amp;nbsp;방법&amp;nbsp;중&amp;nbsp;하나를&amp;nbsp;선택할&amp;nbsp;수&amp;nbsp;있습니다. &lt;br /&gt;&lt;br /&gt;#&amp;nbsp;방법&amp;nbsp;1:&amp;nbsp;패딩&amp;nbsp;기능&amp;nbsp;완전&amp;nbsp;비활성화 &lt;br /&gt;&lt;br /&gt;파라미터&amp;nbsp;개수가&amp;nbsp;늘어나는&amp;nbsp;것&amp;nbsp;자체가&amp;nbsp;싫고,&amp;nbsp;쿼리&amp;nbsp;종류가&amp;nbsp;많지&amp;nbsp;않아&amp;nbsp;실행&amp;nbsp;계획&amp;nbsp;재사용의&amp;nbsp;이점이&amp;nbsp;적다면&amp;nbsp;설정을&amp;nbsp;통해&amp;nbsp;끌&amp;nbsp;수&amp;nbsp;있습니다. &lt;br /&gt;&lt;br /&gt;*&amp;nbsp;application.yml&amp;nbsp;설정: &lt;br /&gt;&lt;br /&gt;```yaml &lt;br /&gt;spring: &lt;br /&gt;&amp;nbsp;&amp;nbsp;jpa: &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;properties: &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;hibernate.query.in_clause_parameter_padding:&amp;nbsp;false &lt;br /&gt;&lt;br /&gt;``` &lt;br /&gt;&lt;br /&gt;&amp;gt;&amp;nbsp;주의:&amp;nbsp;이&amp;nbsp;설정을&amp;nbsp;끄면&amp;nbsp;`IN&amp;nbsp;(1,&amp;nbsp;2,&amp;nbsp;3)`과&amp;nbsp;`IN&amp;nbsp;(1,&amp;nbsp;2,&amp;nbsp;3,&amp;nbsp;4)`가&amp;nbsp;서로&amp;nbsp;다른&amp;nbsp;쿼리로&amp;nbsp;취급되어&amp;nbsp;DB&amp;nbsp;부하가&amp;nbsp;소폭&amp;nbsp;증가할&amp;nbsp;수&amp;nbsp;있습니다. &lt;br /&gt;&lt;br /&gt;#&amp;nbsp;방법&amp;nbsp;2:&amp;nbsp;배치&amp;nbsp;사이즈(Batch&amp;nbsp;Size)&amp;nbsp;제한 &lt;br /&gt;&lt;br /&gt;특정&amp;nbsp;연관&amp;nbsp;관계&amp;nbsp;조회에서&amp;nbsp;발생하는&amp;nbsp;문제라면&amp;nbsp;`@BatchSize`를&amp;nbsp;사용하여&amp;nbsp;한&amp;nbsp;번에&amp;nbsp;넘길&amp;nbsp;파라미터의&amp;nbsp;최대치를&amp;nbsp;강제로&amp;nbsp;고정할&amp;nbsp;수&amp;nbsp;있습니다. &lt;br /&gt;&lt;br /&gt;```java &lt;br /&gt;@BatchSize(size&amp;nbsp;=&amp;nbsp;100)&amp;nbsp;//&amp;nbsp;152개라면&amp;nbsp;100개,&amp;nbsp;52개로&amp;nbsp;나누어&amp;nbsp;실행됨 &lt;br /&gt;@OneToMany(mappedBy&amp;nbsp;=&amp;nbsp;&quot;parent&quot;) &lt;br /&gt;private&amp;nbsp;List&amp;lt;Child&amp;gt;&amp;nbsp;children; &lt;br /&gt;&lt;br /&gt;``` &lt;br /&gt;&lt;br /&gt;#&amp;nbsp;방법&amp;nbsp;3:&amp;nbsp;애플리케이션&amp;nbsp;레벨에서&amp;nbsp;리스트&amp;nbsp;분할&amp;nbsp;(Partitioning) &lt;br /&gt;&lt;br /&gt;가장&amp;nbsp;확실하게&amp;nbsp;제어하는&amp;nbsp;방법은&amp;nbsp;대량의&amp;nbsp;리스트를&amp;nbsp;직접&amp;nbsp;일정한&amp;nbsp;크기로&amp;nbsp;나누어&amp;nbsp;쿼리를&amp;nbsp;여러&amp;nbsp;번&amp;nbsp;호출하는&amp;nbsp;것입니다. &lt;br /&gt;&lt;br /&gt;```java &lt;br /&gt;//&amp;nbsp;Google&amp;nbsp;Guava&amp;nbsp;라이브러리&amp;nbsp;활용&amp;nbsp;예시 &lt;br /&gt;List&amp;lt;List&amp;lt;Long&amp;gt;&amp;gt;&amp;nbsp;partitionedIds&amp;nbsp;=&amp;nbsp;Lists.partition(originalIds,&amp;nbsp;100); &lt;br /&gt;&lt;br /&gt;for&amp;nbsp;(List&amp;lt;Long&amp;gt;&amp;nbsp;batch&amp;nbsp;:&amp;nbsp;partitionedIds)&amp;nbsp;{ &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;repository.findAllByIdIn(batch); &lt;br /&gt;} &lt;br /&gt;&lt;br /&gt;``` &lt;br /&gt;&lt;br /&gt;이&amp;nbsp;방식은&amp;nbsp;DB에&amp;nbsp;전달되는&amp;nbsp;파라미터&amp;nbsp;개수를&amp;nbsp;100개&amp;nbsp;이하로&amp;nbsp;엄격하게&amp;nbsp;관리할&amp;nbsp;수&amp;nbsp;있어&amp;nbsp;성능&amp;nbsp;예측이&amp;nbsp;쉬워집니다. &lt;br /&gt;&lt;br /&gt;--- &lt;br /&gt;&lt;br /&gt;&amp;nbsp;3.&amp;nbsp;요약&amp;nbsp;및&amp;nbsp;권장&amp;nbsp;사항 &lt;br /&gt;&lt;br /&gt;*&amp;nbsp;성능&amp;nbsp;중심:&amp;nbsp;패딩&amp;nbsp;기능을&amp;nbsp;켜두는&amp;nbsp;것이&amp;nbsp;좋습니다.&amp;nbsp;(DB&amp;nbsp;CPU&amp;nbsp;효율&amp;nbsp;증대) &lt;br /&gt;*&amp;nbsp;로그&amp;nbsp;가독성&amp;nbsp;및&amp;nbsp;정밀&amp;nbsp;제어&amp;nbsp;중심:&amp;nbsp;`in_clause_parameter_padding:&amp;nbsp;false`로&amp;nbsp;설정하세요. &lt;br /&gt;*&amp;nbsp;대량&amp;nbsp;데이터&amp;nbsp;처리:&amp;nbsp;설정과&amp;nbsp;무관하게&amp;nbsp;`Lists.partition`&amp;nbsp;등을&amp;nbsp;이용해&amp;nbsp;애플리케이션에서&amp;nbsp;100~500&amp;nbsp;단위로&amp;nbsp;끊어서&amp;nbsp;요청하는&amp;nbsp;것이&amp;nbsp;메모리와&amp;nbsp;성능&amp;nbsp;면에서&amp;nbsp;가장&amp;nbsp;안전합니다. &lt;br /&gt;---&lt;/p&gt;</description>
      <category>IT/프로그래밍</category>
      <author>Collin</author>
      <guid isPermaLink="true">https://collinsd.tistory.com/621</guid>
      <comments>https://collinsd.tistory.com/621#entry621comment</comments>
      <pubDate>Fri, 6 Feb 2026 07:00:11 +0900</pubDate>
    </item>
    <item>
      <title>@Transactional의 동작</title>
      <link>https://collinsd.tistory.com/620</link>
      <description>&lt;pre class=&quot;coffeescript&quot; style=&quot;background-color: #2b2b2b; color: #a9b7c6;&quot;&gt;&lt;code&gt;@Transactional(rollbackFor = Exception.class)&lt;/code&gt;&lt;/pre&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;  기본 동작&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;@Transactional은 &lt;b&gt;기본적으로 RuntimeException과 Error가 발생하면 롤백&lt;/b&gt;합니다.&lt;/li&gt;
&lt;li&gt;즉, 체크 예외(Exception의 하위 클래스지만 RuntimeException이 아닌 것들)는 기본적으로 롤백 대상이 아닙니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;  rollbackFor 옵션의 의미&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;rollbackFor = Exception.class라고 지정하면, &lt;b&gt;체크 예외까지 포함해서 모든 예외가 발생하면 롤백&lt;/b&gt;하도록 강제합니다.&lt;/li&gt;
&lt;li&gt;기본값이 &quot;모든 예외 롤백&quot;이 아니라 &quot;런타임 예외만 롤백&quot;이기 때문에, 위처럼 명시적으로 지정하는 경우가 많습니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;  왜 이렇게 쓰는가?&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;비즈니스 로직에서 IOException, SQLException 같은 체크 예외가 발생했을 때도 트랜잭션을 롤백하고 싶을 수 있습니다.&lt;/li&gt;
&lt;li&gt;기본 설정만 쓰면 이런 체크 예외는 롤백되지 않고 커밋될 수 있어, 데이터 정합성 문제가 생길 수 있습니다.&lt;/li&gt;
&lt;li&gt;그래서 rollbackFor = Exception.class를 붙여 &lt;b&gt;모든 예외 상황에서 안전하게 롤백&lt;/b&gt;되도록 하는 거죠.&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;✅ 정리하면:&lt;br /&gt;rollbackFor가 기본 true가 아니라, 기본은 &lt;b&gt;런타임 예외만 롤백&lt;/b&gt;입니다.&lt;br /&gt;체크 예외까지 롤백하려고 rollbackFor = Exception.class를 명시하는 거예요.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>IT/프로그래밍</category>
      <author>Collin</author>
      <guid isPermaLink="true">https://collinsd.tistory.com/620</guid>
      <comments>https://collinsd.tistory.com/620#entry620comment</comments>
      <pubDate>Sat, 13 Dec 2025 08:10:21 +0900</pubDate>
    </item>
    <item>
      <title>대규모 트래픽을 효율적으로 처리하기 위해  어떤 접근과 기술을 사용할 수 있나요?</title>
      <link>https://collinsd.tistory.com/619</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000; font-size: 1.44em; letter-spacing: -1px;&quot;&gt;  면접 질문&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&quot;Java 웹 애플리케이션에서 대규모 트래픽을 효율적으로 처리하기 위해 어떤 아키텍처적 접근과 기술을 사용할 수 있나요?&quot;&lt;/b&gt;&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;  모범 답변&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;스케일 아웃(Scale-out) 구조&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;단일 서버 성능 향상보다 &lt;b&gt;로드 밸런싱&lt;/b&gt;을 통한 서버 확장 방식을 선호합니다.&lt;/li&gt;
&lt;li&gt;Nginx, HAProxy 같은 로드 밸런서를 활용해 트래픽을 분산합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;비동기 처리와 메시지 큐&lt;/b&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;Kafka, RabbitMQ 같은 메시지 큐를 사용해 비동기 이벤트 기반 아키텍처를 구축합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;캐싱 전략&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;DB 부하를 줄이기 위해 Redis, Memcached 같은 &lt;b&gt;인메모리 캐시&lt;/b&gt;를 적극 활용합니다.&lt;/li&gt;
&lt;li&gt;정적 리소스는 CDN을 통해 제공하여 서버 부담을 줄입니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;데이터베이스 최적화&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;읽기/쓰기 분리(Replication), 샤딩(Sharding)으로 확장성을 확보합니다.&lt;/li&gt;
&lt;li&gt;JPA/Hibernate 사용 시 N+1 문제를 피하기 위해 Fetch 전략을 신중히 선택합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;비즈니스 로직 분리 (마이크로서비스)&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;모놀리식 구조 대신 **마이크로서비스 아키텍처(MSA)**를 적용해 서비스별 독립적 확장성을 확보합니다.&lt;/li&gt;
&lt;li&gt;Spring Cloud, Kubernetes 같은 오케스트레이션 도구를 활용합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;모니터링과 자동화&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Prometheus, Grafana로 성능 모니터링을 하고, 장애 발생 시 빠르게 대응합니다.&lt;/li&gt;
&lt;li&gt;CI/CD 파이프라인을 통해 자동 배포 및 롤백을 지원합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;1. 스케일 아웃 (Scale-out) 구조&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;Q1:&lt;/b&gt; &quot;로드 밸런싱 시 세션 관리 문제를 어떻게 해결하나요?&quot;&lt;br /&gt;&lt;b&gt;A1:&lt;/b&gt; 세션 스티키(sticky session)를 사용할 수도 있지만, 확장성 문제 때문에 Redis 같은 외부 세션 저장소를 활용해 서버 간 세션을 공유합니다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Q2:&lt;/b&gt; &quot;스케일 업과 스케일 아웃 중 어떤 상황에서 각각 적합하다고 보나요?&quot;&lt;br /&gt;&lt;b&gt;A2:&lt;/b&gt; 단기적으로 성능 향상이 필요할 때는 스케일 업이 빠르지만, 장기적으로 트래픽 증가에 대응하려면 스케일 아웃이 더 유연합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;2. 비동기 처리와 메시지 큐&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;Q1:&lt;/b&gt; &quot;메시지 큐를 도입했을 때 장애 상황을 어떻게 대비하나요?&quot;&lt;br /&gt;&lt;b&gt;A1:&lt;/b&gt; 메시지 큐 장애 시 재시도 로직을 구현하고, DLQ(Dead Letter Queue)를 활용해 실패 메시지를 별도로 관리합니다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Q2:&lt;/b&gt; &quot;Kafka와 RabbitMQ를 선택할 때 기준은 무엇인가요?&quot;&lt;br /&gt;&lt;b&gt;A2:&lt;/b&gt; Kafka는 대규모 스트리밍 데이터 처리에 강점이 있고, RabbitMQ는 라우팅과 복잡한 메시지 패턴에 적합합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;3. 캐싱 전략&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;Q1:&lt;/b&gt; &quot;캐시 갱신 정책은 어떻게 설정하나요?&quot;&lt;br /&gt;&lt;b&gt;A1:&lt;/b&gt; TTL(Time To Live)을 설정하거나, Write-through/Write-behind 전략을 사용해 데이터 일관성을 유지합니다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Q2:&lt;/b&gt; &quot;캐시로 인한 데이터 불일치 문제를 어떻게 해결하나요?&quot;&lt;br /&gt;&lt;b&gt;A2:&lt;/b&gt; 캐시 무효화 정책을 명확히 하고, 중요한 데이터는 DB와 캐시를 동시에 검증하는 방식을 적용합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;4. 데이터베이스 최적화&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;Q1:&lt;/b&gt; &quot;읽기/쓰기 분리 시 발생할 수 있는 문제는 무엇인가요?&quot;&lt;br /&gt;&lt;b&gt;A1:&lt;/b&gt; 데이터 동기화 지연으로 인해 읽기 노드에서 최신 데이터가 반영되지 않을 수 있습니다. 이를 보완하기 위해 읽기 요청을 특정 상황에서는 마스터 DB로 보내도록 합니다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Q2:&lt;/b&gt; &quot;JPA에서 N+1 문제를 어떻게 해결하나요?&quot;&lt;br /&gt;&lt;b&gt;A2:&lt;/b&gt; Fetch Join을 사용하거나, @EntityGraph를 활용해 필요한 데이터를 한 번에 가져오도록 합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;5. 마이크로서비스 아키텍처 (MSA)&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;Q1:&lt;/b&gt; &quot;MSA 도입 시 가장 큰 어려움은 무엇인가요?&quot;&lt;br /&gt;&lt;b&gt;A1:&lt;/b&gt; 서비스 간 통신 복잡성과 데이터 일관성 관리가 가장 큰 도전 과제입니다. 이를 위해 API Gateway와 Saga 패턴을 활용합니다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Q2:&lt;/b&gt; &quot;모놀리식에서 MSA로 전환할 때 어떤 기준으로 서비스를 분리하나요?&quot;&lt;br /&gt;&lt;b&gt;A2:&lt;/b&gt; 비즈니스 도메인 중심으로 분리하고, 각 서비스가 독립적으로 배포 및 확장 가능해야 합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;6. 모니터링과 자동화&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;Q1:&lt;/b&gt; &quot;모니터링 지표 중 가장 중요하게 보는 것은 무엇인가요?&quot;&lt;br /&gt;&lt;b&gt;A1:&lt;/b&gt; 응답 시간(latency), 에러율, CPU/메모리 사용량 같은 지표를 우선적으로 모니터링합니다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Q2:&lt;/b&gt; &quot;CI/CD 파이프라인에서 롤백 전략은 어떻게 구성하나요?&quot;&lt;br /&gt;&lt;b&gt;A2:&lt;/b&gt; 블루-그린 배포나 카나리 배포를 활용해 문제가 발생하면 이전 버전으로 빠르게 전환할 수 있도록 합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>IT/개발자 면접</category>
      <author>Collin</author>
      <guid isPermaLink="true">https://collinsd.tistory.com/619</guid>
      <comments>https://collinsd.tistory.com/619#entry619comment</comments>
      <pubDate>Wed, 10 Dec 2025 08:50:13 +0900</pubDate>
    </item>
    <item>
      <title>SLOW SQL 수정할 때 고려사항</title>
      <link>https://collinsd.tistory.com/618</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;SLOW SQL 튜닝 시 가장 중요한 고려사항은 실행계획 분석, 인덱스 활용, SELECT 범위 최소화입니다. 이 세 가지가 성능 개선의 핵심이며, 그 외에도 조인 방식, 정렬/집계 처리, 통계 정보 최신화 등이 중요합니다.&lt;/b&gt;&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;  SLOW SQL 튜닝 핵심 고려사항 (중요도 순)&lt;/h3&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;1️⃣ &lt;b&gt;실행계획(Execution Plan) 분석&lt;/b&gt;&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;가장 중요한 첫 단계: DB가 쿼리를 어떻게 수행하는지 확인&lt;/li&gt;
&lt;li&gt;확인 항목: 인덱스 사용 여부, 테이블 스캔 방식, 조인 순서, 예상 비용(Cost)&lt;/li&gt;
&lt;li&gt;도구: EXPLAIN, AUTOTRACE, SQL PLAN 등&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;2️⃣ &lt;b&gt;인덱스 활용 여부&lt;/b&gt;&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;WHERE 절, JOIN 조건에 인덱스 컬럼 사용 여부 확인&lt;/li&gt;
&lt;li&gt;주의: 함수 사용, 형 변환, OR 조건 등은 인덱스를 무효화할 수 있음&lt;/li&gt;
&lt;li&gt;대응: 인덱스 설계 최적화, 조건절 단순화&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;3️⃣ &lt;b&gt;SELECT 컬럼 범위 최소화&lt;/b&gt;&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;SELECT * 사용 지양: 불필요한 I/O 증가&lt;/li&gt;
&lt;li&gt;정확히 필요한 컬럼만 명시: 실행 계획 재사용 가능성 증가&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;4️⃣ &lt;b&gt;조인 방식 및 순서 최적화&lt;/b&gt;&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Nested Loop vs Hash Join 등 조인 방식 선택&lt;/li&gt;
&lt;li&gt;큰 테이블을 먼저 읽는 구조는 피해야 함&lt;/li&gt;
&lt;li&gt;불필요한 FULL SCAN 조인 제거&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;5️⃣ &lt;b&gt;GROUP BY, ORDER BY 처리 방식&lt;/b&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;/ul&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;6️⃣ &lt;b&gt;서브쿼리 vs JOIN 구조 개선&lt;/b&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;JOIN으로 구조 변경 시 성능 향상 가능&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;7️⃣ &lt;b&gt;통계 정보 및 옵티마이저 최신화&lt;/b&gt;&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;DB가 잘못된 실행계획을 선택할 수 있음&lt;/li&gt;
&lt;li&gt;통계 정보 최신화로 정확한 계획 수립 유도&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;8️⃣ &lt;b&gt;페이징 처리 (LIMIT, OFFSET 등)&lt;/b&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;/ul&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;  실무 팁 요약&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;EXPLAIN으로 실행계획부터 확인&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;인덱스가 무효화되지 않도록 조건절 점검&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;SELECT * 대신 필요한 컬럼만 명시&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;JOIN 구조와 순서 최적화&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;정렬/집계는 인덱스로 대체 가능 여부 확인&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;통계 정보 최신화는 튜닝의 기본&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>IT/개발자 면접</category>
      <author>Collin</author>
      <guid isPermaLink="true">https://collinsd.tistory.com/618</guid>
      <comments>https://collinsd.tistory.com/618#entry618comment</comments>
      <pubDate>Sat, 22 Nov 2025 08:00:03 +0900</pubDate>
    </item>
    <item>
      <title>java Call by Value와 Call by Reference</title>
      <link>https://collinsd.tistory.com/616</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;자바에서 Call by Value(값에 의한 호출)와 Call by Reference(참조에 의한 호출)의 차이는 '무엇이 전달되는가'에 있습니다. 자바는 기본적으로 Call by Value만 지원합니다.&lt;/b&gt;&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;  핵심 차이 요약&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;항목 Call by Value (값에 의한 호출) Call by Reference (참조에 의한 호출)&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;전달 방식&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;변수의 값을 복사해서 전달&lt;/td&gt;
&lt;td&gt;변수의 *주소(참조)*를 전달&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;원본 데이터 영향&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;메서드 내에서 변경해도 원본에 영향 없음&lt;/td&gt;
&lt;td&gt;메서드 내에서 변경 시 원본 데이터도 변경됨&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;자바에서의 지원&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;✅ 기본형(primitive type)에 적용됨&lt;/td&gt;
&lt;td&gt;❌ 자바는 엄밀히 말해 Call by Reference를 지원하지 않음&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;객체 전달 시&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;객체의 참조값이 복사되어 전달됨 &amp;rarr; 객체 내부는 변경 가능&lt;/td&gt;
&lt;td&gt;참조 자체를 바꾸는 건 불가능 (새 객체 할당 시 원본 영향 없음)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;  예시로 이해하기&lt;/h3&gt;
&lt;pre class=&quot;arduino&quot;&gt;&lt;code&gt;class Dog {
    String name;
}

public class Test {
    public static void changeName(Dog d) {
        d.name = &quot;Max&quot;; // 객체 내부 값 변경 &amp;rarr; 원본 영향 O
        d = new Dog();  // 새로운 객체 할당 &amp;rarr; 원본 영향 X
        d.name = &quot;Charlie&quot;;
    }

    public static void main(String[] args) {
        Dog dog = new Dog();
        dog.name = &quot;Buddy&quot;;
        changeName(dog);
        System.out.println(dog.name); // 결과: &quot;Max&quot;
    }
}
&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;d.name = &quot;Max&quot;는 원본 객체의 필드를 변경 &amp;rarr; &lt;b&gt;영향 있음&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;d = new Dog()는 참조 자체를 바꿈 &amp;rarr; &lt;b&gt;원본 객체에는 영향 없음&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;  정리&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;자바는 모든 메서드 호출을 Call by Value로 처리&lt;/b&gt;합니다.&lt;/li&gt;
&lt;li&gt;객체를 전달할 때도 *참조값(reference)*을 복사해서 전달하므로, 객체의 &lt;b&gt;내부 상태는 변경 가능&lt;/b&gt;하지만, &lt;b&gt;참조 자체를 바꾸면 원본에는 영향 없음&lt;/b&gt;입니다.&lt;/li&gt;
&lt;li&gt;C++ 같은 언어는 진짜 Call by Reference를 지원하지만, 자바는 그렇지 않습니다&lt;/li&gt;
&lt;/ul&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>IT/개발자 면접</category>
      <author>Collin</author>
      <guid isPermaLink="true">https://collinsd.tistory.com/616</guid>
      <comments>https://collinsd.tistory.com/616#entry616comment</comments>
      <pubDate>Fri, 21 Nov 2025 08:00:49 +0900</pubDate>
    </item>
    <item>
      <title>웹 서버 취약점 목록 및 요약</title>
      <link>https://collinsd.tistory.com/617</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;웹 서버 취약점은 해커가 시스템을 침해하거나 정보를 탈취할 수 있는 보안상의 약점입니다. 주요 취약점은 OWASP Top 10과 일반적인 서버 취약점으로 나뉘며, 각각에 대한 이해와 대응이 필수입니다.&lt;/b&gt;&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;  대표적인 웹 서버 취약점 목록 및 요약&lt;/h3&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;✅ OWASP Top 10 기반 주요 취약점&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;OWASP(Open Web Application Security Project)는 웹 보안의 표준 가이드라인을 제공합니다:&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;&lt;b&gt;Broken Access Control (접근 제어 실패)&lt;/b&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;대응: 역할 기반 접근 제어(RBAC), 서버 측 권한 검증&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Cryptographic Failures (암호화 실패)&lt;/b&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;대응: HTTPS 사용, 강력한 암호화 알고리즘 적용&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Injection (SQL, OS, LDAP 등)&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;악의적 명령어 삽입으로 DB나 시스템 제어&lt;/li&gt;
&lt;li&gt;대응: 입력값 검증, Prepared Statement 사용&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Insecure Design (불안전한 설계)&lt;/b&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;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Security Misconfiguration (보안 설정 오류)&lt;/b&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;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Vulnerable and Outdated Components&lt;/b&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;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Identification and Authentication Failures&lt;/b&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;대응: 다중 인증(MFA), 강력한 패스워드 정책&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Software and Data Integrity Failures&lt;/b&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;대응: 서명된 코드 사용, CI/CD 보안 강화&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Security Logging and Monitoring Failures&lt;/b&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;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Server-Side Request Forgery (SSRF)&lt;/b&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;대응: 외부 요청 제한, URL 화이트리스트 적용&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&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;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;XSS (크로스사이트 스크립팅)&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;악성 스크립트를 사용자 브라우저에 삽입&lt;/td&gt;
&lt;td&gt;입력값 필터링, Content Security Policy 적용&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;Directory Traversal&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;상위 디렉토리 접근을 통한 파일 노출&lt;/td&gt;
&lt;td&gt;경로 필터링, 파일 접근 제한&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;Buffer Overflow&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;과도한 입력으로 메모리 침범&lt;/td&gt;
&lt;td&gt;입력 길이 제한, 예외 처리&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;Command Injection&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;시스템 명령어 실행 유도&lt;/td&gt;
&lt;td&gt;입력값 검증, 쉘 명령어 사용 제한&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;File Upload 취약점&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;악성 파일 업로드로 서버 제어&lt;/td&gt;
&lt;td&gt;확장자 및 MIME 타입 검증, 실행 권한 제한&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;  핵심 요약&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;입력값 검증&lt;/b&gt;은 거의 모든 취약점 대응의 기본입니다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;최신 보안 패치 적용&lt;/b&gt;과 &lt;b&gt;불필요한 기능 제거&lt;/b&gt;는 서버 보안의 핵심입니다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;보안 로그와 모니터링&lt;/b&gt;은 침해 사고 탐지에 필수입니다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;OWASP Top 10&lt;/b&gt;은 웹 보안 점검의 출발점으로 삼아야 합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;웹 서버 보안은 단순한 기술 문제가 아니라 기업 신뢰와 직결되는 중요한 요소입니다. 보안 점검 자동화 도구나 전문가의 정기 점검도 고려해보세요.&lt;/p&gt;</description>
      <category>IT/개발자 면접</category>
      <author>Collin</author>
      <guid isPermaLink="true">https://collinsd.tistory.com/617</guid>
      <comments>https://collinsd.tistory.com/617#entry617comment</comments>
      <pubDate>Fri, 21 Nov 2025 07:00:42 +0900</pubDate>
    </item>
    <item>
      <title>java Overloading과 Overriding</title>
      <link>https://collinsd.tistory.com/615</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;자바에서 오버로딩과 오버라이딩은 모두 메서드를 다형적으로 사용하는 방식이지만, 목적과 사용 방식이 다릅니다.&lt;/b&gt;&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;  오버로딩 (Overloading)&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;같은 이름의 메서드를 매개변수만 다르게 정의하는 것&lt;/b&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;b&gt;정의 위치&lt;/b&gt;: 같은 클래스 내에서 사용&lt;/li&gt;
&lt;li&gt;&lt;b&gt;조건&lt;/b&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;b&gt;리턴 타입만 다르면 오버로딩 불가능&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;예시&lt;/b&gt;:&lt;/li&gt;
&lt;li&gt;void print() {} void print(String s) {} void print(int x, int y) {}&lt;/li&gt;
&lt;li&gt;&lt;b&gt;용도&lt;/b&gt;: 다양한 입력에 대해 같은 기능을 수행하고 싶을 때&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;  오버라이딩 (Overriding)&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;상위 클래스의 메서드를 하위 클래스에서 재정의하는 것&lt;/b&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;b&gt;정의 위치&lt;/b&gt;: 상속 관계에서 하위 클래스에서 사용&lt;/li&gt;
&lt;li&gt;&lt;b&gt;조건&lt;/b&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;@Override 어노테이션 사용 권장&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;예시&lt;/b&gt;:&lt;/li&gt;
&lt;li&gt;class Animal { void sound() { System.out.println(&quot;Animal sound&quot;); } } class Dog extends Animal { @Override void sound() { System.out.println(&quot;Bark&quot;); } }&lt;/li&gt;
&lt;li&gt;&lt;b&gt;용도&lt;/b&gt;: 상속받은 기능을 자식 클래스에서 변경하고 싶을 때&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;  핵심 차이 요약&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;항목 오버로딩 오버라이딩&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;관계&lt;/td&gt;
&lt;td&gt;같은 클래스 내&lt;/td&gt;
&lt;td&gt;상속 관계 (부모 &amp;rarr; 자식)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;메서드 이름&lt;/td&gt;
&lt;td&gt;같음&lt;/td&gt;
&lt;td&gt;같음&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;매개변수&lt;/td&gt;
&lt;td&gt;다름&lt;/td&gt;
&lt;td&gt;같음&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;리턴 타입&lt;/td&gt;
&lt;td&gt;상관 없음&lt;/td&gt;
&lt;td&gt;같아야 함&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;목적&lt;/td&gt;
&lt;td&gt;다양한 입력 처리&lt;/td&gt;
&lt;td&gt;부모 메서드 기능 재정의&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>IT/개발자 면접</category>
      <author>Collin</author>
      <guid isPermaLink="true">https://collinsd.tistory.com/615</guid>
      <comments>https://collinsd.tistory.com/615#entry615comment</comments>
      <pubDate>Thu, 20 Nov 2025 20:00:28 +0900</pubDate>
    </item>
  </channel>
</rss>