<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>매운코딩</title>
    <link>https://cceeun.tistory.com/</link>
    <description>쉽지 않지만 꾸준히 하면 된다.</description>
    <language>ko</language>
    <pubDate>Tue, 4 Aug 2026 21:50:44 +0900</pubDate>
    <generator>TISTORY</generator>
    <ttl>100</ttl>
    <managingEditor>또또쪼</managingEditor>
    <image>
      <title>매운코딩</title>
      <url>https://tistory1.daumcdn.net/tistory/3727728/attach/20a6a61facd445e7a99a374c76deaf4e</url>
      <link>https://cceeun.tistory.com</link>
    </image>
    <item>
      <title>[Springboot] Spring AI ChatClient 사용법과 오류 해결</title>
      <link>https://cceeun.tistory.com/402</link>
      <description>&lt;h1&gt;Spring AI ChatClient 사용법과 오류 해결&lt;/h1&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Spring AI에서 ChatClient를 &lt;code&gt;org.springframework.ai.chat.client.ChatClient&lt;/code&gt; 못찾는 오류 해결법을 작성해본다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;기본 사용법부터 실전 예제, 그리고 그 유명한 클래스패스 오류까지 차근차근 풀어보자.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;ChatClient 기본 개념과 생성&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ChatClient는 Spring AI에서 AI 모델과 대화할 때 쓰는 fluent API다. ChatModel 위에 쌓여 있어서 Prompt를 메시지 단위로 쉽게 조립하고, 동기/스트리밍 둘 다 지원한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;가장 간단한 생성법은 Spring Boot 자동 구성 쓰는 거. Controller에서 ChatClient.Builder를 주입받아서 build하면 된다.&lt;/p&gt;
&lt;pre class=&quot;kotlin&quot;&gt;&lt;code&gt;@RestController
class MyController {
    private final ChatClient chatClient;

    public MyController(ChatClient.Builder chatClientBuilder) {
        this.chatClient = chatClientBuilder.build();
    }

    @GetMapping(&quot;/ai&quot;)
    String generate(@RequestParam String message) {
        return this.chatClient.prompt()
                .user(message)
                .call()
                .content();
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;여기서 &lt;code&gt;.prompt().user(message).call().content()&lt;/code&gt; 흐름이 핵심이다. user()로 사용자 메시지 넣고 call() 치면 AI 응답이 String으로 나온다.&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;시스템 메시지와 파라미터 넣기&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;실무에선 시스템 프롬프트 없으면 안 된다. 기본 시스템 메시지 설정하거나 동적으로 param 넣을 수 있다.&lt;/p&gt;
&lt;pre class=&quot;mipsasm&quot;&gt;&lt;code&gt;@Bean
ChatClient chatClient(ChatClient.Builder builder) {
    return builder
            .defaultSystem(&quot;너는 {voice}처럼 말하는 챗봇이야.&quot;)
            .build();
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Controller에서 쓰려면:&lt;/p&gt;
&lt;pre class=&quot;less&quot;&gt;&lt;code&gt;@GetMapping(&quot;/ai/chat&quot;)
Map&amp;lt;String, String&amp;gt; chat(@RequestParam String message, @RequestParam String voice) {
    return Map.of(&quot;response&quot;,
            chatClient.prompt()
                    .system(sp -&amp;gt; sp.param(&quot;voice&quot;, voice))
                    .user(message)
                    .call()
                    .content());
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;.system()에 람다로 param 주입하는 게 포인트. 공식 문서에 따르면 이렇게 하면 템플릿처럼 동작한다. voice가 &quot;친근하게&quot;면 그에 맞춰 응답 나온다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;스트리밍 응답 예제&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Flux로 실시간 스트리밍 하려면 .stream() 쓰면 된다. 채팅 앱에서 딱이다.&lt;/p&gt;
&lt;pre class=&quot;less&quot;&gt;&lt;code&gt;@GetMapping(&quot;/stream&quot;)
Flux&amp;lt;String&amp;gt; stream(@RequestParam String message) {
    return chatClient.prompt()
            .user(message)
            .stream()
            .content();
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이거 연결해서 WebFlux 쓰면 토큰 단위로 응답이 쭉 흘러간다. 배포해보니 OpenAI 모델에서 특히 빠르게 느껴지더라.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&quot;ChatClient that could not be found&quot; 오류 해결&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 오류는 대체로 의존성 누락이나 버전 충돌, 자동 구성 실패 때 뜬다. 나도 OpenAI starter 추가했는데 뜨길래 pom.xml부터 확인했다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;1. 의존성 확인&lt;/b&gt;&lt;/p&gt;
&lt;pre class=&quot;xml&quot;&gt;&lt;code&gt;&amp;lt;dependency&amp;gt;
    &amp;lt;groupId&amp;gt;org.springframework.ai&amp;lt;/groupId&amp;gt;
    &amp;lt;artifactId&amp;gt;spring-ai-openai-spring-boot-starter&amp;lt;/artifactId&amp;gt;
    &amp;lt;version&amp;gt;1.0.0-M1&amp;lt;/version&amp;gt;  &amp;lt;!-- 최신 버전으로 --&amp;gt;
&amp;lt;/dependency&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;spring-ai-openai만 넣으면 ChatClient 패키지가 안 잡힌다. &lt;b&gt;starter&lt;/b&gt; 버전 써야 자동 구성 된다.&lt;a href=&quot;https://stackoverflow.com/questions/79493596/chatclientbuilder-that-could-not-be-found&quot;&gt;^1_4&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;2. Builder 주입 문제&lt;/b&gt;&lt;br /&gt;Controller에서 &lt;code&gt;private ChatClient.Builder chatClientBuilder;&lt;/code&gt; 필드 선언하고 @Autowired 안 하면 NullPointer. 생성자 주입으로:&lt;/p&gt;
&lt;pre class=&quot;cpp&quot;&gt;&lt;code&gt;public MyController(ChatClient.Builder builder) {
    this.chatClient = builder.build();
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;직접 필드에 넣지 말고 생성자에서 build.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;3. 여러 ChatModel 있을 때&lt;/b&gt;&lt;br /&gt;OpenAI + Ollama 두 개 쓰면 &quot;No qualifying bean of type 'ChatModel'&quot; 뜬다. 각 모델별 ChatClient 빈 따로 만들어:&lt;/p&gt;
&lt;pre class=&quot;less&quot;&gt;&lt;code&gt;@Bean
@Qualifier(&quot;openai&quot;)
ChatClient openAiClient(ChatClient.Builder builder) {
    return ChatClient.builder(openAiChatModel).build();
}

@Bean
@Qualifier(&quot;ollama&quot;)
ChatClient ollamaClient(OllamaChatModel ollamaModel) {
    return ChatClient.create(ollamaModel);
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그리고 Controller에서 @Qualifier로 지정. 이게 제일 깔끔하다.&lt;a href=&quot;https://goodteacher.tistory.com/824&quot;&gt;^1_2&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;4. Milestone 리포지토리 추가&lt;/b&gt;&lt;/p&gt;
&lt;pre class=&quot;xml&quot;&gt;&lt;code&gt;&amp;lt;repositories&amp;gt;
    &amp;lt;repository&amp;gt;
        &amp;lt;id&amp;gt;spring-milestones&amp;lt;/id&amp;gt;
        &amp;lt;url&amp;gt;https://repo.spring.io/milestone&amp;lt;/url&amp;gt;
    &amp;lt;/repository&amp;gt;
&amp;lt;/repositories&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;M1, RC1 같은 버전은 여기서 끌어온다.&lt;/p&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;ChatClient는 프로토타입 빈이라 매번 새로 build 가능. 싱글톤으로 고정 안 해도 된다.&lt;/li&gt;
&lt;li&gt;.advisor()로 메모리나 RAG 추가 쉬움. 예: &lt;code&gt;.advisor(new ChatMemoryAdvisor(chatMemory))&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;application.yml에 &lt;code&gt;spring.ai.openai.api-key&lt;/code&gt; 설정 잊으면 런타임에서 터짐.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이렇게 해보니 안정적으로 돌아가더라. 공식 문서 예제 따라 하다 막히는 부분 위주로 정리해봤다. 실제 프로젝트에 넣어보고 싶으면 OpenAI 키부터 세팅해보시라.&lt;br /&gt;&lt;span style=&quot;display: none;&quot;&gt;&lt;a href=&quot;https://github.com/spring-projects/spring-ai/issues/3150&quot;&gt;^1_10&lt;/a&gt;&lt;a href=&quot;https://velog.io/@seongm1n/1-Spring-AI%EB%A1%9C-%EA%B5%AC%EC%A1%B0%ED%99%94%EB%90%9C-%EC%9D%91%EB%8B%B5-%EC%83%9D%EC%84%B1%ED%95%98%EA%B8%B0&quot;&gt;^1_7&lt;/a&gt;&lt;a href=&quot;https://velog.io/@pcoeid/Spring.OpenAi.SpringAi.chatgpt&quot;&gt;^1_9&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;
&lt;div align=&quot;center&quot;&gt;⁂&lt;/div&gt;</description>
      <category>프로그래밍/Spring Boot FW</category>
      <author>또또쪼</author>
      <guid isPermaLink="true">https://cceeun.tistory.com/402</guid>
      <comments>https://cceeun.tistory.com/402#entry402comment</comments>
      <pubDate>Fri, 20 Feb 2026 19:00:59 +0900</pubDate>
    </item>
    <item>
      <title>[Springboot] Spring 엑셀 읽기/쓰기 라이브러리 별 비교 - Apache POI, EasyExcel, FastExcel 비교</title>
      <link>https://cceeun.tistory.com/401</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;Java와 Spring 프레임워크 기반의 애플리케이션 개발 시 엑셀 파일의 읽기 및 쓰기 기능은 비즈니스 로직에서 필수적인 요소 중 하나다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;대량의 데이터를 시각화하거나 사용자가 업로드한 데이터를 시스템에 반영할 때 다양한 라이브러리가 활용된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Spring 엑셀 관련 라이브러리에 대해 각각 비교해보겠따.&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;b&gt;1. Apache POI&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Apache POI는 매~~~우 흔히 사용되는 표준같은 라이브러리다. 역사가 깊음..ㅋ&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;마이크로소프트 오피스 파일 형식을 다루는 오픈소스 프로젝트로, 엑셀뿐만 아니라 워드, 파워포인트 등 다양한 문서를 지원한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;특징 및 장점 이 라이브러리는 엑셀의 거의 모든 기능을 제어할 수 있는 저수준 API를 제공한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;셀의 스타일, 폰트, 수식, 병합 등 세밀한 디자인 조정이 가능하다. 또한 HSSF(구형 .xls)와 XSSF(신형 .xlsx) 형식을 모두 지원하며, 대용량 처리를 위한 SXSSF(Streaming XSSF) 방식도 제공한다.&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;단점 기본적인 XSSF 방식은 엑셀 파일을 읽거나 쓸 때 전체 데이터를 메모리에 로드한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이로 인해 데이터 양이 많아질수록 OutOfMemoryError가 발생할 위험이 크다.&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;pre class=&quot;java&quot; data-ke-language=&quot;java&quot;&gt;&lt;code&gt;//XSSF 쓰기 예제

Workbook workbook = new XSSFWorkbook();
Sheet sheet = workbook.createSheet(&quot;Sheet1&quot;);
Row row = sheet.createRow(0);
Cell cell = row.createCell(0);
cell.setCellValue(&quot;Hello POI&quot;);

try (FileOutputStream fileOut = new FileOutputStream(&quot;poi_example.xlsx&quot;)) {
    workbook.write(fileOut);
} finally {
    workbook.close();
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;2. Excel Streaming Reader (xlsx-streamer)&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Apache POI의 메모리 문제를 해결하기 위해 등장한 확장 라이브러리다. 주로 대용량 엑셀 파일을 읽을 때 사용한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;특징 및 장점 POI의 편리한 인터페이스를 유지하면서도 데이터를 스트리밍 방식으로 읽어 메모리 점유율을 획기적으로 낮춘다. 임시 파일을 생성하여 데이터를 처리하므로 매우 큰 파일도 안전하게 읽을 수 있다. 기존 POI 코드를 크게 수정하지 않고 적용할 수 있다는 점이 매력적이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;단점 데이터를 읽는 용도에 최적화되어 있어 쓰기 기능은 POI의 SXSSF를 그대로 사용해야 한다. 또한 임시 파일 관리 설정이 필요할 수 있다.&lt;/p&gt;
&lt;pre class=&quot;reasonml&quot;&gt;&lt;code&gt;InputStream is = new FileInputStream(new File(&quot;large_file.xlsx&quot;));
Workbook workbook = StreamingReader.builder()
        .rowCacheSize(100)    // 메모리에 보유할 행 수
        .bufferSize(4096)     // 버퍼 크기
        .open(is);            // 스트리밍으로 열기

for (Sheet sheet : workbook) {
    for (Row r : sheet) {
        for (Cell c : r) {
            System.out.println(c.getStringCellValue());
        }
    }
}
&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;&lt;b&gt;3. EasyExcel&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Alibaba에서 개발한 EasyExcel은 POI의 복잡함과 메모리 문제를 동시에 해결하기 위해 설계된 고성능 라이브러리다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;특징 및 장점 가장 큰 특징은 메모리 효율성이다. 파일을 한 줄씩 읽어 처리하기 때문에 수백만 건의 데이터도 적은 메모리로 처리할 수 있다. 또한 어노테이션 기반으로 자바 객체(DTO)와 엑셀 시트를 직접 매핑할 수 있어 코드가 매우 간결해진다. 대규모 엔터프라이즈 환경에서 데이터 배치 처리에 매우 유리하다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;단점 POI에 비해 세부적인 서식 지정이나 복잡한 엑셀 기능 구현에는 제약이 있을 수 있다. 또한 오픈소스 생태계가 특정 기업 위주로 돌아간다는 점이 고려 대상이다.&lt;/p&gt;
&lt;pre class=&quot;reasonml&quot;&gt;&lt;code&gt;public class ExcelData {
    @ExcelProperty(&quot;이름&quot;)
    private String name;
    
    @ExcelProperty(&quot;나이&quot;)
    private int age;
}

// 데이터 리스트를 파일로 저장
EasyExcel.write(&quot;easy_example.xlsx&quot;, ExcelData.class)
         .sheet(&quot;목록&quot;)
         .doWrite(dataList);
&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;&lt;b&gt;4. FastExcel&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;FastExcel은 속도와 메모리 절약을 최우선 목표로 하는 가벼운 라이브러리다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;특징 및 장점 매우 빠른 처리 속도를 자랑한다. XML 스트리밍 방식을 사용하여 대용량 데이터를 생성할 때 POI보다 우수한 성능을 보여준다. 의존성이 적어 프로젝트를 가볍게 유지할 수 있다.&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 class=&quot;reasonml&quot;&gt;&lt;code&gt;try (OutputStream os = new FileOutputStream(&quot;fast_example.xlsx&quot;)) {
    Workbook wb = new Workbook(os, &quot;MyApplication&quot;, &quot;1.0&quot;);
    Worksheet ws = wb.newWorksheet(&quot;Sheet 1&quot;);
    ws.value(0, 0, &quot;Fast Content&quot;);
    wb.finish();
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&amp;lt;상세 지표 비교 평가&amp;gt;&lt;/b&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점 만점의 별점으로 평가한 결과다.&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%; height: 102px;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot; data-ke-style=&quot;style12&quot;&gt;
&lt;tbody&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;height: 17px;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;height: 17px;&quot;&gt;&lt;span&gt;읽기속도&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;height: 17px;&quot;&gt;&lt;span&gt;쓰기속도&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;height: 17px;&quot;&gt;&lt;span&gt;메모리&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;height: 17px;&quot;&gt;&lt;span&gt;효율&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;height: 17px;&quot;&gt;&lt;span&gt;기능성&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;height: 17px;&quot;&gt;&lt;span&gt;안정도&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;height: 17px;&quot;&gt;&lt;span&gt;Apache POI&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;height: 17px;&quot;&gt;&lt;span&gt;★☆☆☆☆&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;height: 17px;&quot;&gt;&lt;span&gt;★☆☆☆☆&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;height: 17px;&quot;&gt;&lt;span&gt;★☆☆☆☆&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;height: 17px;&quot;&gt;&lt;span&gt;★★★★★&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;height: 17px;&quot;&gt;&lt;span&gt;★★★★★&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;height: 17px;&quot;&gt;&lt;span&gt;★★★★★&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;height: 17px;&quot;&gt;&lt;span&gt;Streaming Reader&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;height: 17px;&quot;&gt;&lt;span&gt;★★★★☆&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;height: 17px;&quot;&gt;&lt;span&gt;-&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;height: 17px;&quot;&gt;&lt;span&gt;★★★★☆&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;height: 17px;&quot;&gt;&lt;span&gt;★★☆☆☆&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;height: 17px;&quot;&gt;&lt;span&gt;★★★★☆&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;height: 17px;&quot;&gt;&lt;span&gt;★★★☆☆&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;height: 17px;&quot;&gt;&lt;span&gt;EasyExcel&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;height: 17px;&quot;&gt;&lt;span&gt;★★★★★&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;height: 17px;&quot;&gt;&lt;span&gt;★★★★★&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;height: 17px;&quot;&gt;&lt;span&gt;★★★★★&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;height: 17px;&quot;&gt;&lt;span&gt;★★★★☆&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;height: 17px;&quot;&gt;&lt;span&gt;★★★★☆&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;height: 17px;&quot;&gt;&lt;span&gt;★★★★☆&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;height: 17px;&quot;&gt;&lt;span&gt;FastExcel&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;height: 17px;&quot;&gt;&lt;span&gt;★★★★☆&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;height: 17px;&quot;&gt;&lt;span&gt;★★★★★&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;height: 17px;&quot;&gt;&lt;span&gt;★★★★★&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;height: 17px;&quot;&gt;&lt;span&gt;★★☆☆☆&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;height: 17px;&quot;&gt;&lt;span&gt;★★★☆☆&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;height: 17px;&quot;&gt;&lt;span&gt;★★☆☆☆&lt;/span&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;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&amp;lt;라이브러리 비교 요약&amp;gt;&lt;/b&gt;&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot; data-ke-style=&quot;style13&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 25.1163%;&quot;&gt;&amp;nbsp;&lt;/td&gt;
&lt;td style=&quot;width: 28.6047%;&quot;&gt;주요 용도&lt;/td&gt;
&lt;td style=&quot;width: 7.67442%;&quot;&gt;난이도&lt;/td&gt;
&lt;td style=&quot;width: 38.4884%;&quot;&gt;특징&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 25.1163%;&quot;&gt;&lt;span&gt;Apache POI&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 28.6047%;&quot;&gt;&lt;span&gt;복잡한 서식/소량 데이터&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 7.67442%;&quot;&gt;&lt;span&gt;높음&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 38.4884%;&quot;&gt;&lt;span&gt;모든 기능 제어 가능, 업계 표준&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 25.1163%;&quot;&gt;&lt;span&gt;Streaming Reader&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 28.6047%;&quot;&gt;&lt;span&gt;대용량 읽기 전용&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 7.67442%;&quot;&gt;&lt;span&gt;보통&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 38.4884%;&quot;&gt;&lt;span&gt;POI 인터페이스 활용, OOM 방지&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 25.1163%;&quot;&gt;&lt;span&gt;EasyExcel&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 28.6047%;&quot;&gt;&lt;span&gt;대용량 읽기/쓰기&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 7.67442%;&quot;&gt;&lt;span&gt;낮음&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 38.4884%;&quot;&gt;&lt;span&gt;어노테이션 기반, 개발 속도 빠름&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 25.1163%;&quot;&gt;&lt;span&gt;FastExcel&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 28.6047%;&quot;&gt;&lt;span&gt;대용량 쓰기 특화&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 7.67442%;&quot;&gt;&lt;span&gt;낮음&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 38.4884%;&quot;&gt;&lt;span&gt;속도가 매우 빠름, 가벼운 의존성&lt;/span&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;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;결론.!!!! 프로젝트의 요구사항이 정교한 리포트 출력과 셀 병합, 복잡한 스타일링이라면 Apache POI가 가장 안전한 선택이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;하지만 수만 건 이상의 데이터를 처리해야 한다면 EasyExcel이나 Streaming Reader를 사용하는 것이 서버 안정성 측면에서 필수적이다. 단순한 데이터 덤프 목적이라면 FastExcel이 가장 효율적인 대안이 된다. 서비스의 특성과 처리할 데이터의 규모를 먼저 파악한 뒤 적절한 도구를 선택하는 것이 중요하다.&lt;/p&gt;</description>
      <category>프로그래밍/Spring Framework</category>
      <category>java</category>
      <category>Spring</category>
      <category>Spring boot</category>
      <author>또또쪼</author>
      <guid isPermaLink="true">https://cceeun.tistory.com/401</guid>
      <comments>https://cceeun.tistory.com/401#entry401comment</comments>
      <pubDate>Thu, 12 Feb 2026 21:07:54 +0900</pubDate>
    </item>
    <item>
      <title>[Git] Git 주요 명령어 및 사용 예제</title>
      <link>https://cceeun.tistory.com/400</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;git 사용 시에 자주 활용하는 명령어 예제를 정리한다. (순전히 내가 보기 위함..)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-pm-slice=&quot;1 3 []&quot; data-ke-size=&quot;size26&quot;&gt;1. 환경 설정 (Configuration)&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Git을 처음 설치하거나 새 환경에서 시작할 때 사용자 정보를 설정한다.&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;git config --global user.name &quot;Your Name&quot;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;사용자 이메일 설정&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;git config --global user.email &quot;your_email@example.com&quot;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;설정 확인&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;git config --list&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;2. 저장소 시작 및 복제 (Init &amp;amp; Clone)&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;프로젝트를 Git으로 관리하기 시작하거나 원격 저장소를 로컬로 가져오는 단계다.&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;새로운 Git 저장소 초기화&lt;/b&gt;현재 디렉토리에 .git 폴더가 생성되며 버전 관리가 시작된다.&lt;/li&gt;
&lt;li&gt;git init&lt;/li&gt;
&lt;li&gt;&lt;b&gt;원격 저장소 복제&lt;/b&gt;기존에 존재하는 원격 저장소의 전체 내용을 로컬로 내려받는다.&lt;/li&gt;
&lt;li&gt;git clone [&lt;a href=&quot;https://github.com/username/repository.git](https://github.com/username/repository.git)&quot;&gt;https://github.com/username/repository.git](https://github.com/username/repository.git)&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;3. 변경 사항 기록 (Add &amp;amp; Commit)&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&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;git add file.txt # 특정 파일 git add . # 변경된 모든 파일&lt;/li&gt;
&lt;li&gt;&lt;b&gt;커밋 생성&lt;/b&gt;-m 옵션을 통해 커밋 메시지를 함께 작성한다.&lt;/li&gt;
&lt;li&gt;git commit -m &quot;feat: 로그인 기능 추가&quot;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;상태 확인&lt;/b&gt;현재 어떤 파일이 수정되었고, 스테이징되었는지 확인한다.&lt;/li&gt;
&lt;li&gt;git status&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;4. 이력 확인 (Log &amp;amp; Diff)&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&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;git log git log --oneline # 한 줄로 요약해서 보기&lt;/li&gt;
&lt;li&gt;&lt;b&gt;변경 사항 비교&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;git diff # 워킹 디렉토리와 스테이징 영역 비교 git diff --staged # 스테이징 영역과 마지막 커밋 비교&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;5. 브랜치 관리 (Branch &amp;amp; Merge)&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;독립적인 작업 공간을 만들고 합치는 Git의 핵심 기능이다.&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;git branch feature-login # 생성 git branch # 목록 조회&lt;/li&gt;
&lt;li&gt;&lt;b&gt;브랜치 전환&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;git switch feature-login # 최신 방식 git checkout feature-login # 기존 방식&lt;/li&gt;
&lt;li&gt;&lt;b&gt;브랜치 병합&lt;/b&gt;현재 브랜치(보통 main/master)에 특정 브랜치의 변경 사항을 합친다.&lt;/li&gt;
&lt;li&gt;git merge feature-login&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;6. 원격 저장소 상호작용 (Remote &amp;amp; Push/Pull)&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&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;git remote add origin [&lt;a href=&quot;https://github.com/user/repo.git](https://github.com/user/repo.git)&quot;&gt;https://github.com/user/repo.git](https://github.com/user/repo.git)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;로컬 변경 사항 업로드&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;git push origin main&lt;/li&gt;
&lt;li&gt;&lt;b&gt;원격 변경 사항 내려받기 및 병합&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;git pull origin main&lt;/li&gt;
&lt;li&gt;&lt;b&gt;원격 변경 사항 가져오기 (병합 안 함)&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;git fetch origin&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;7. 작업 되돌리기 (Reset &amp;amp; Revert)&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&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;git reset --hard HEAD~1 # 마지막 커밋을 지우고 이전으로 완전히 복구&lt;/li&gt;
&lt;li&gt;&lt;b&gt;커밋 취소 (새 커밋으로 반대 작업)&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;git revert &amp;lt;commit_id&amp;gt; # 기존 이력을 유지하면서 변경 사항만 되돌림&lt;/li&gt;
&lt;/ul&gt;</description>
      <category>프로그래밍/형상관리 ( Git )</category>
      <author>또또쪼</author>
      <guid isPermaLink="true">https://cceeun.tistory.com/400</guid>
      <comments>https://cceeun.tistory.com/400#entry400comment</comments>
      <pubDate>Tue, 10 Feb 2026 20:31:09 +0900</pubDate>
    </item>
    <item>
      <title>[Spring Boot] Circular view path 에러 해결 방법 &amp;ndash; would dispatch back to the current handler URL</title>
      <link>https://cceeun.tistory.com/399</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;Spring Boot에서 아래처럼 생긴 에러 메시지 한 번쯤은 볼 수 있다.&lt;/span&gt;&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div data-testid=&quot;code-language-indicator&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;pre id=&quot;code_1770183383754&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;Circular view path [index]: would dispatch back to the current handler URL [/index] again&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;겉으로 보면 템플릿이나 설정 문제 같지만, 대부분은 &lt;b&gt;요청 URL이랑 뷰 이름을 똑같이 써서&lt;/b&gt; 생기는 경우다&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;circular-view-path&quot; 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;size16&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;스프링 MVC에서 @Controller 메서드가 문자열을 리턴하면, 그 값은 템플릿 파일 경로가 아니라 &amp;ldquo;뷰 이름(view name)&amp;rdquo;으로 처리된다.&lt;/span&gt;&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;div data-testid=&quot;code-language-indicator&quot;&gt;
&lt;pre id=&quot;code_1770183412315&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;@GetMapping(&quot;/welcome&quot;)
public String welcome(Model model) {
    model.addAttribute(&quot;message&quot;, &quot;Hello&quot;);
    return &quot;welcome&quot;; // =&amp;gt; templates/welcome.html
}&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;Spring Boot 기본 설정에서는 대략 이런 식으로 prefix / suffix가 잡혀 있다.&lt;/span&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;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;prefix: classpath:/templates/&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;suffix: .html&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;그래서 return &quot;welcome&quot;; 이면 src/main/resources/templates/welcome.html 을 찾게 된다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;문제는 URL이랑 뷰 이름을 이렇게 맞춰버렸을 때다.&lt;/span&gt;&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;div&gt;
&lt;pre id=&quot;code_1770184073258&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;@GetMapping(&quot;/index&quot;)
public String index() {
    return &quot;index&quot;;
}&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&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: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;요청 URL: /index&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;뷰 이름: index&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;요청 경로와 뷰 이름이 그대로 겹치면, 내부에서 디스패치 과정이 꼬인다. 요청을 처리하고 다시 뷰를 찾아 넘기는 과정에서 같은 URL로 계속 포워딩하려고 하다 보니, 이걸 순환 경로로 판단해서 Circular view path 에러를 던진다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;에러 페이지를 커스터마이징하면서 /error 경로와 뷰 이름을 둘 다 error 로 맞춰버려도 비슷한 문제가 생긴다. &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&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;
&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: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;1) URL을 바꾸는 방법&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;가장 손이 덜 가는 방법은 URL을 바꾸는 거였다. 나는 홈 화면을 아예 루트(/)로 노출하도록 정리했다.&lt;/span&gt;&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;pre id=&quot;code_1770184084477&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;@Controller
public class HomeController {

    @GetMapping(&quot;/&quot;)
    public String home(Model model) {
        model.addAttribute(&quot;username&quot;, &quot;jin&quot;);
        return &quot;index&quot;; // templates/index.html
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif; letter-spacing: 0px;&quot;&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif; letter-spacing: 0px;&quot;&gt;구성은 이렇다.&lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&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: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;URL: /&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;뷰 이름: index&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;템플릿: src/main/resources/templates/index.html&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;이 조합이면 요청 경로와 뷰 이름이 직접 부딪치지 않기 때문에, Circular view path 에러가 나지 않는다.&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;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;2) 뷰 이름을 바꾸는 방법&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;반대로 /index 라는 URL을 유지하고 싶다면, 뷰 이름 쪽을 바꾸면 된다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1770184235365&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;@Controller
public class HomeController {

    @GetMapping(&quot;/index&quot;)
    public String index(Model model) {
        model.addAttribute(&quot;username&quot;, &quot;jin&quot;);
        return &quot;home/index&quot;;
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;템플릿 구조는 이렇게 맞췄다.&lt;/span&gt;&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;실제 프로젝트에서는 이런 식으로 디렉터리까지 포함해서 home/index, user/list 같이&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt; 뷰 이름을 조금 길게 가져가는 패턴이 더 많이 쓰인다. &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;URL 계층과 템플릿 폴더 구조를 어느 정도 맞추면서도, 경로와 뷰 이름을 완전히 1:1로 겹치게 만들지는 않는 편이다.&lt;/span&gt;&lt;/p&gt;
&lt;h2 id=&quot;&quot; data-ke-size=&quot;size26&quot;&gt;&amp;nbsp;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;내가 삽질하면서 한 번쯤 같이 보게 됐던 포인트들도 정리해 보면.....&lt;/span&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;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;&lt;u&gt;컨트롤러 매핑 중복&lt;/u&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;같은 URL(/index, /error 등)을 여러 컨트롤러나 메서드에서 매핑해두면, 실제로 어느 쪽이 호출되는지 헷갈리면서 디스패치가 꼬일 수 있다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;&lt;u&gt;뷰 리졸버/템플릿 경로 커스터마이징&lt;/u&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;spring.thymeleaf.prefix, spring.thymeleaf.suffix 를 수정해뒀다면, 템플릿 경로가 그 설정에 맞게 옮겨졌는지 같이 봐야 한다. 템플릿을 못 찾고 에러 경로로 떨어졌다가 다시 순환에 빠지는 식으로 이어질 수 있다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;&lt;u&gt;에러 페이지 커스터마이징&lt;/u&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;기본 Whitelabel 에러 페이지를 끄고 직접 /error 를 처리할 때, 컨트롤러 매핑과 뷰 이름을 둘 다 error 로 맞춰두면 아까 본 것처럼 순환 에러가 나기 쉽다. 에러 뷰를 error/default, error/404 이런 식으로 조금 더 구체적인 이름으로 나눠두는 게 안전했다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;&lt;u&gt;정적 리소스 경로와의 충돌&lt;/u&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;정적 리소스 경로를 커스터마이징하면서 컨트롤러가 CSS/JS 요청을 가로채는 경우도 있다. 이때 그 요청을 처리하는 메서드가 또 템플릿 이름과 겹치는 값을 리턴하면 비슷한 종류의 문제가 생길 수 있다.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;결국 이 에러를 보면 템플릿 파일부터 뒤지기보다는...&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;&lt;b&gt;요청 URL이랑 뷰 이름이 그대로 겹치는 곳이 있는지&lt;/b&gt; 먼저 확인하는 게 훨씬 빠르게 해결되는 것 같다.&lt;/span&gt;&lt;/p&gt;</description>
      <category>프로그래밍/Spring Boot FW</category>
      <category>Spring</category>
      <category>springboot</category>
      <author>또또쪼</author>
      <guid isPermaLink="true">https://cceeun.tistory.com/399</guid>
      <comments>https://cceeun.tistory.com/399#entry399comment</comments>
      <pubDate>Wed, 4 Feb 2026 20:54:25 +0900</pubDate>
    </item>
    <item>
      <title>[도메인] Cloudflare에서 도메인 구매하는 방법, 가비아 비교</title>
      <link>https://cceeun.tistory.com/398</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;br&gt;Cloudflare에서 도메인을 구매하는 방법에 대해 포스팅 해보겠다.&lt;br&gt;&amp;nbsp;&lt;br&gt;먼저 구매하고 싶은 도메인이 가능한지를 확인해봐야한다.&lt;br&gt;&lt;a href=&quot;https://www.cloudflare.com/ko-kr/products/registrar/&quot; target=&quot;_blank&quot;&gt;&lt;span&gt;https://www.cloudflare.com/ko-kr/products/registrar/&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;&lt;figure data-ke-type=&quot;opengraph&quot; data-og-title=&quot;Cloudflare Registrar | 도메인 등록 및 갱신&quot; data-ke-align=&quot;alignCenter&quot; data-og-description=&quot;Cloudflare는 Cloudflare Registrar를 통해 간편한 원가 도메인 등록 및 갱신 서비스를 제공합니다. 추가 수수료 없이 도메인을 구매, 이전 및 관리하세요.&quot; data-og-host=&quot;www.cloudflare.com&quot; data-og-source-url=&quot;https://www.cloudflare.com/ko-kr/products/registrar/&quot; data-og-image=&quot;https://blog.kakaocdn.net/dna/cSvQs8/dJMb87NRhzQ/AAAAAAAAAAAAAAAAAAAAAPHeAxsyGUcGaO5UhkljyEgjkoeuTyo-5HC1UTlJPtbz/img.png?credential=yqXZFxpELC7KVnFOS48ylbz2pIh7yKj8&amp;amp;expires=1769871599&amp;amp;allow_ip=&amp;amp;allow_referer=&amp;amp;signature=NC%2FGY%2FBSbnW7%2BZakNfqxsEALV4g%3D&quot; data-og-url=&quot;https://www.cloudflare.com/ko-kr/products/registrar/&quot;&gt;&lt;a href=&quot;https://www.cloudflare.com/ko-kr/products/registrar/&quot; target=&quot;_blank&quot; data-source-url=&quot;https://www.cloudflare.com/ko-kr/products/registrar/&quot;&gt;&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://blog.kakaocdn.net/dna/cSvQs8/dJMb87NRhzQ/AAAAAAAAAAAAAAAAAAAAAPHeAxsyGUcGaO5UhkljyEgjkoeuTyo-5HC1UTlJPtbz/img.png?credential=yqXZFxpELC7KVnFOS48ylbz2pIh7yKj8&amp;amp;expires=1769871599&amp;amp;allow_ip=&amp;amp;allow_referer=&amp;amp;signature=NC%2FGY%2FBSbnW7%2BZakNfqxsEALV4g%3D')&quot;&gt; &lt;/div&gt;&lt;div class=&quot;og-text&quot;&gt;&lt;p class=&quot;og-title&quot;&gt;Cloudflare Registrar | 도메인 등록 및 갱신&lt;/p&gt;&lt;p class=&quot;og-desc&quot;&gt;Cloudflare는 Cloudflare Registrar를 통해 간편한 원가 도메인 등록 및 갱신 서비스를 제공합니다. 추가 수수료 없이 도메인을 구매, 이전 및 관리하세요.&lt;/p&gt;&lt;p class=&quot;og-host&quot;&gt;www.cloudflare.com&lt;/p&gt;&lt;/div&gt;&lt;/a&gt;&lt;/figure&gt;&lt;p data-ke-size=&quot;size16&quot;&gt;여기 Cloudflare Register 사이트에 들어가서 검색해보면 된다.&lt;br&gt;&amp;nbsp;&lt;/p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2906&quot; data-origin-height=&quot;1174&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/1zB0P/dJMcaioDWDd/wold0ZVE1p9XRWBbKbyuwK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/1zB0P/dJMcaioDWDd/wold0ZVE1p9XRWBbKbyuwK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/1zB0P/dJMcaioDWDd/wold0ZVE1p9XRWBbKbyuwK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F1zB0P%2FdJMcaioDWDd%2Fwold0ZVE1p9XRWBbKbyuwK%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;2906&quot; height=&quot;1174&quot; data-origin-width=&quot;2906&quot; data-origin-height=&quot;1174&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;도메인 검색에다가 원하는 도메인을 풀네임으로 적어서 검색을 해보면..&lt;br&gt;나는 happy.com 이 있는지를 봤따.&lt;/p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2078&quot; data-origin-height=&quot;1632&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/nRafA/dJMcai9XgXU/NIBrN9ZbZBYhnSsnj6yaBK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/nRafA/dJMcai9XgXU/NIBrN9ZbZBYhnSsnj6yaBK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/nRafA/dJMcai9XgXU/NIBrN9ZbZBYhnSsnj6yaBK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FnRafA%2FdJMcai9XgXU%2FNIBrN9ZbZBYhnSsnj6yaBK%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;2078&quot; height=&quot;1632&quot; data-origin-width=&quot;2078&quot; data-origin-height=&quot;1632&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;역시나 있군..&lt;br&gt;그래서 대안으로 다른거를 추천해준다.. 해피걸스.net 뭐냐고요;;&lt;br&gt;&amp;nbsp;&lt;br&gt;&amp;nbsp;&lt;br&gt;&amp;nbsp;&lt;br&gt;아무튼.. 여기에서도 가능하고.. 아예 cloudflare에서 Domains 메뉴에서도 [Buy a domain]으로도 가능하다.&lt;br&gt;&amp;nbsp;&lt;/p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;3000&quot; data-origin-height=&quot;1192&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/oFDRG/dJMcagj26If/4Q2dhksyayNEgdqc3ltB3k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/oFDRG/dJMcagj26If/4Q2dhksyayNEgdqc3ltB3k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/oFDRG/dJMcagj26If/4Q2dhksyayNEgdqc3ltB3k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FoFDRG%2FdJMcagj26If%2F4Q2dhksyayNEgdqc3ltB3k%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;3000&quot; height=&quot;1192&quot; data-origin-width=&quot;3000&quot; data-origin-height=&quot;1192&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2036&quot; data-origin-height=&quot;1470&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bhRgod/dJMcaaD8TUC/3EgsD0T5pk8wSTN4xDTmEk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bhRgod/dJMcaaD8TUC/3EgsD0T5pk8wSTN4xDTmEk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bhRgod/dJMcaaD8TUC/3EgsD0T5pk8wSTN4xDTmEk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbhRgod%2FdJMcaaD8TUC%2F3EgsD0T5pk8wSTN4xDTmEk%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;2036&quot; height=&quot;1470&quot; data-origin-width=&quot;2036&quot; data-origin-height=&quot;1470&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;동일하게 Search..&lt;br&gt;&amp;nbsp;&lt;/p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2598&quot; data-origin-height=&quot;1550&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/lPiRq/dJMcai9XgXT/VKKYZPBWUrUbOriyjCHmmK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/lPiRq/dJMcai9XgXT/VKKYZPBWUrUbOriyjCHmmK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/lPiRq/dJMcai9XgXT/VKKYZPBWUrUbOriyjCHmmK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FlPiRq%2FdJMcai9XgXT%2FVKKYZPBWUrUbOriyjCHmmK%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;2598&quot; height=&quot;1550&quot; data-origin-width=&quot;2598&quot; data-origin-height=&quot;1550&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;내가 원하는 도메인이 가능하다!&lt;br&gt;Purchase로 구매하기 고고&lt;/p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1352&quot; data-origin-height=&quot;1644&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/oNY66/dJMcabC3CUa/0EeH0cHQATku9jPmOutwR0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/oNY66/dJMcabC3CUa/0EeH0cHQATku9jPmOutwR0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/oNY66/dJMcabC3CUa/0EeH0cHQATku9jPmOutwR0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FoNY66%2FdJMcabC3CUa%2F0EeH0cHQATku9jPmOutwR0%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;507&quot; height=&quot;617&quot; data-origin-width=&quot;1352&quot; data-origin-height=&quot;1644&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1년단위로 도매인 구매가 가능하다.&lt;br&gt;cloudflare 도매인 구매 입력방법 작성방법은 아래와 같다.&amp;nbsp;&lt;br&gt;First name : 이름&lt;br&gt;Last name : 성&amp;nbsp;&lt;br&gt;적어주면된다.&lt;br&gt;&amp;nbsp;&lt;br&gt;참고로 아래 내용은 도메인구매 입력폼에 기입한 개인정보는 다 막아준다고 하니 참고하자.&lt;br&gt;&lt;span style=&quot;background-color: #ffffff;&quot;&gt;&lt;span style=&quot;color: #0051c3;&quot;&gt;Cloudflare Registrar redacts registrant personal information from its&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;background-color: #ffffff;&quot;&gt;&lt;span style=&quot;color: #0051c3;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;public WHOIS service&lt;span style=&quot;background-color: #ffffff;&quot;&gt;&lt;span style=&quot;color: #0051c3;&quot;&gt;; however, it cannot control whether the registry redacts personal information from its own WHOIS service. In some cases, the registry may display personal information in their WHOIS service.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1052&quot; data-origin-height=&quot;1390&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/7Ync9/dJMcabQzG8D/iA02oCJHJ2SbMHKjUu8M8k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/7Ync9/dJMcabQzG8D/iA02oCJHJ2SbMHKjUu8M8k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/7Ync9/dJMcabQzG8D/iA02oCJHJ2SbMHKjUu8M8k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F7Ync9%2FdJMcabQzG8D%2FiA02oCJHJ2SbMHKjUu8M8k%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;449&quot; height=&quot;593&quot; data-origin-width=&quot;1052&quot; data-origin-height=&quot;1390&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;전화번호, 국가 작성&lt;br&gt;Adress line 1 -&amp;gt; 번지수, 신주소&lt;br&gt;Adress line 2 -&amp;gt; 실제 동/호수&lt;br&gt;State -&amp;gt; 구&lt;br&gt;Postal code -&amp;gt; 우편번호&lt;/p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1878&quot; data-origin-height=&quot;1494&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cOn9Fb/dJMcagqOAoN/29gaMcd7roktsMMzAJtQGK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cOn9Fb/dJMcagqOAoN/29gaMcd7roktsMMzAJtQGK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cOn9Fb/dJMcagqOAoN/29gaMcd7roktsMMzAJtQGK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcOn9Fb%2FdJMcagqOAoN%2F29gaMcd7roktsMMzAJtQGK%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;1878&quot; height=&quot;1494&quot; data-origin-width=&quot;1878&quot; data-origin-height=&quot;1494&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;카드번호까지 입력을 하면 된다.&lt;br&gt;밑에 영수증 주소로 위에 적은 주소와동일하게 복사가 될건데 굳이 바꿀 필요는 없다.&lt;/p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;984&quot; data-origin-height=&quot;1252&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bz0GI1/dJMcaiWrq6i/neKZVhx7RhWM0eNbugpuy0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bz0GI1/dJMcaiWrq6i/neKZVhx7RhWM0eNbugpuy0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bz0GI1/dJMcaiWrq6i/neKZVhx7RhWM0eNbugpuy0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbz0GI1%2FdJMcaiWrq6i%2FneKZVhx7RhWM0eNbugpuy0%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;984&quot; height=&quot;1252&quot; data-origin-width=&quot;984&quot; data-origin-height=&quot;1252&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Complete purchase를 통해서 결제까지 하면 완료!&lt;/p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;14&quot; data-origin-height=&quot;4&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bgNZor/dJMcacPvzbr/P3w0zXM3WD3rsYy5rdFx6k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bgNZor/dJMcacPvzbr/P3w0zXM3WD3rsYy5rdFx6k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bgNZor/dJMcacPvzbr/P3w0zXM3WD3rsYy5rdFx6k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbgNZor%2FdJMcacPvzbr%2FP3w0zXM3WD3rsYy5rdFx6k%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;14&quot; height=&quot;4&quot; data-origin-width=&quot;14&quot; data-origin-height=&quot;4&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;짜잔 이렇게 구매완료 됐다는 페이지가 뜬다.&lt;br&gt;&amp;nbsp;&lt;br&gt;국내 도메인 호스팅 업체로 유명한 가비아보다 훨씬 더 싼거같다.&lt;br&gt;전반적으로 그냥 cloudflare가 제일 동일 도메인 단가가 낮은듯!&lt;br&gt;&amp;nbsp;&lt;br&gt;이상으로 cloudflare 도메인 구매 방법이 였다 안녕~&lt;br&gt;&amp;nbsp;&lt;br&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>취미/이것저것</category>
      <category>도메인</category>
      <author>또또쪼</author>
      <guid isPermaLink="true">https://cceeun.tistory.com/398</guid>
      <comments>https://cceeun.tistory.com/398#entry398comment</comments>
      <pubDate>Sat, 31 Jan 2026 19:47:49 +0900</pubDate>
    </item>
    <item>
      <title>[적금] 2026 &amp;quot;청년미래적금&amp;quot; 총 정리 - 가입 조건 | 우대 혜택 | 청녁도약계좌와 비교</title>
      <link>https://cceeun.tistory.com/397</link>
      <description>&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;400&quot; data-origin-height=&quot;400&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/eFggdM/dJMcadt2i3G/2M0sktBEQWIMSiLKYQk690/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/eFggdM/dJMcadt2i3G/2M0sktBEQWIMSiLKYQk690/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/eFggdM/dJMcadt2i3G/2M0sktBEQWIMSiLKYQk690/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FeFggdM%2FdJMcadt2i3G%2F2M0sktBEQWIMSiLKYQk690%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;400&quot; height=&quot;400&quot; data-origin-width=&quot;400&quot; data-origin-height=&quot;400&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2026년에 새롭게 생기는 청년미래적금에 대해 정리해보겠다~~~&lt;br&gt;기존의 ‘청년도약계좌’가 5년이라는 긴 만기 때문에 부담스러웠던 분들이라면, 이번에 신설되는 &lt;b&gt;3년 만기&lt;/b&gt;의 청년미래적금 소식에 주목해 주세요. 금융위원회와 관계 부처의 공식 보도자료를 기반으로 핵심 정보만 추려 정리해 드립니다.&lt;/p&gt;&lt;h2 data-ke-size=&quot;size26&quot;&gt;1. 청년미래적금이란?&lt;/h2&gt;&lt;p data-ke-size=&quot;size16&quot;&gt;청년미래적금은 정부가 2026년 예산안을 통해 발표한 정책 금융상품으로, 청년들이 보다 현실적인 기간 내에 목돈을 마련할 수 있도록 설계되었습니다.&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;: 짧은 기간(3년), 낮은 납입 부담, 실질적인 목돈 마련 지원&lt;/li&gt;&lt;li&gt;&lt;b&gt;출시 예정&lt;/b&gt;: 2026년 6월 중&lt;/li&gt;&lt;/ul&gt;&lt;h2 data-ke-size=&quot;size26&quot;&gt;2. 가입 대상 및 자격 조건 (공식 기준)&lt;/h2&gt;&lt;p data-ke-size=&quot;size16&quot;&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;b&gt;만 19세 ~ 34세&lt;/b&gt; (병역 이행 기간 최대 6년 인정 시 만 40세까지 가능)&lt;/li&gt; 
 &lt;li&gt;&lt;b&gt;개인소득&lt;/b&gt;: 총급여 &lt;b&gt;6,000만 원 이하&lt;/b&gt; (종합소득 4,800만 원 이하) 
  &lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt; 
   &lt;li&gt;소상공인: 연 매출 3억 원 이하인 경우 가입 가능&lt;/li&gt; 
  &lt;/ul&gt; &lt;/li&gt; 
 &lt;li&gt;&lt;b&gt;가구소득&lt;/b&gt;: 가구원 소득 합계가 &lt;b&gt;기준 중위소득 200% 이하&lt;/b&gt;&lt;/li&gt; 
&lt;/ul&gt;&lt;h2 data-ke-size=&quot;size26&quot;&gt;3. 상품 주요 내용 및 혜택&lt;/h2&gt;&lt;p data-ke-size=&quot;size16&quot;&gt;가장 궁금해하실 납입 조건과 정부 지원금 혜택입니다.&lt;br&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;납입 기간&lt;/b&gt;&lt;/td&gt;&lt;td&gt;&lt;b&gt;3년 (36개월)&lt;/b&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;b&gt;50만 원&lt;/b&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;b&gt;일반형: 납입액의 6%&lt;/b&gt; / &lt;b&gt;우대형: 납입액의 12%&lt;/b&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;b&gt;비과세&lt;/b&gt; 추진 (전액 면제)&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;blockquote data-ke-style=&quot;style1&quot;&gt; 
 &lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;  우대형 대상자란?&lt;/b&gt; 중소기업에 신규 취업(입사 6개월 이내)하거나 저소득 구간에 해당하는 청년 등 특정 요건을 충족하는 경우 12%의 높은 기여금을 지원받습니다.&lt;/p&gt; 
&lt;/blockquote&gt;&lt;h2 data-ke-size=&quot;size26&quot;&gt;4. 예상 수령액 시뮬레이션&lt;/h2&gt;&lt;p data-ke-size=&quot;size16&quot;&gt;월 50만 원을 3년간 성실히 납입했을 때 받을 수 있는 금액(예시)입니다.&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;일반형 (6% 지원)&lt;/b&gt;: 원금 1,800만 원 + 기여금 108만 원 + 은행 이자 = &lt;b&gt;약 2,080만 원&lt;/b&gt;&lt;/li&gt;&lt;li&gt;&lt;b&gt;우대형 (12% 지원)&lt;/b&gt;: 원금 1,800만 원 + 기여금 216만 원 + 은행 이자 = &lt;b&gt;약 2,200만 원&lt;/b&gt;&lt;/li&gt;&lt;li&gt;&lt;b&gt;기대 수익률&lt;/b&gt;: 정부 지원금과 비과세 혜택을 합산하면 &lt;b&gt;연 10%~16% 수준의 적금&lt;/b&gt;에 가입하는 효과와 유사합니다.&lt;/li&gt;&lt;/ul&gt;&lt;h2 data-ke-size=&quot;size26&quot;&gt;5. 청년도약계좌 vs 청년미래적금 비교&lt;/h2&gt;&lt;p data-ke-size=&quot;size16&quot;&gt;기존 상품과 무엇이 달라졌는지 확인해 보세요.&lt;br&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;만기 기간&lt;/b&gt;&lt;/td&gt;&lt;td&gt;5년&lt;/td&gt;&lt;td&gt;&lt;b&gt;3년 (축소)&lt;/b&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;최대 70만 원&lt;/td&gt;&lt;td&gt;최대 50만 원&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;b&gt;정부 지원율&lt;/b&gt;&lt;/td&gt;&lt;td&gt;3% ~ 6%&lt;/td&gt;&lt;td&gt;&lt;b&gt;6% ~ 12% (확대)&lt;/b&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;2025년 말 종료 예정&lt;/td&gt;&lt;td&gt;&lt;b&gt;2026년 6월 개시 예정&lt;/b&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;h2 data-ke-size=&quot;size26&quot;&gt;6. 자주 묻는 질문 (FAQ)&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;Q: 기존 청년도약계좌 가입자도 갈아탈 수 있나요?&lt;/b&gt; &lt;br&gt;A: 네, 금융위원회는 기존 청년도약계좌 가입자가 청년미래적금으로 &lt;b&gt;전환(갈아타기)할 수 있는 방안을 마련&lt;/b&gt;하겠다고 공식 발표했습니다.&lt;/li&gt;&lt;li&gt;&lt;b&gt;Q: 자영업자도 가능한가요?&lt;/b&gt; &lt;br&gt;A: 네, 연 매출 3억 원 이하인 소상공인 청년도 가입 대상에 포함되었습니다.&lt;/li&gt;&lt;/ul&gt;&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;마무리하며&lt;/b&gt; 2026년부터는 만기가 짧아진 만큼 청년들의 중도 해지율은 낮아지고, 자산 형성의 효능감은 더 높아질 것으로 기대됩니다. 정부의 최종 확정 공고가 나오면 다시 한번 상세한 신청 방법을 공유해 드리겠습니다!&lt;br&gt;&lt;i&gt;출처: 금융위원회 보도자료 및 2026년 정부 예산안 상세 내역&lt;/i&gt;&lt;/p&gt;</description>
      <category>경제/예적금</category>
      <category>적금</category>
      <category>청년도약계좌</category>
      <category>청년미래적금</category>
      <author>또또쪼</author>
      <guid isPermaLink="true">https://cceeun.tistory.com/397</guid>
      <comments>https://cceeun.tistory.com/397#entry397comment</comments>
      <pubDate>Thu, 29 Jan 2026 14:36:57 +0900</pubDate>
    </item>
    <item>
      <title>[DAsP] 데이터아키텍처 준전문가 (DAsP) 합격 수기 | 공부 기간 | 난이도</title>
      <link>https://cceeun.tistory.com/396</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;br&gt;데이터아키텍처 준전문가(DAsP) 합격 수기를 작성해보려고 한다.&lt;br&gt;워낙 정보가 너무 없는 자격증이라 내 후기가 도움이 되기를 바란다.&lt;br&gt;#DAsP후기 #DAsP합격후기&lt;br&gt;&amp;nbsp;&lt;br&gt;&amp;nbsp;&lt;br&gt;&amp;nbsp;&lt;/p&gt;&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;background-color: #f6e199;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;1. DAsP 시험 정보&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;/h3&gt;&lt;p data-ke-size=&quot;size16&quot;&gt;DAsP 데이터아키텍처 준전문가라는 자격증으로 민간자격증이고 데이터 아키텍처의 전반적인 능력을 검증하는 시험이다.&amp;nbsp;&lt;br&gt;DAP는 전문가로 실기까지 포함된 시험 (난이도 굉장히 헬이라고 함;)&lt;br&gt;&amp;nbsp;&lt;br&gt;준전문가는 총 90분 시험시간동안 50문항을 푼다.&lt;/p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;984&quot; data-origin-height=&quot;380&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ur12E/dJMcaaYo3o9/F2K07Ku2f6Bk1ZshT3vYp0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ur12E/dJMcaaYo3o9/F2K07Ku2f6Bk1ZshT3vYp0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ur12E/dJMcaaYo3o9/F2K07Ku2f6Bk1ZshT3vYp0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fur12E%2FdJMcaaYo3o9%2FF2K07Ku2f6Bk1ZshT3vYp0%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;984&quot; height=&quot;380&quot; data-origin-width=&quot;984&quot; data-origin-height=&quot;380&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;DAsP의 과목은 총 4개로 (전사아키텍처 이해, 데이터 요건 분석, 데이터 표준화, 데이터 모델링) 각 문항당 문항수가 상이하다. 배점은 같음!&lt;br&gt;&amp;nbsp;&lt;br&gt;DAsP 합격 기준은 총점 60점 이상이여야 하고,과목별로 40%미만 취득시에는 과락이 된다.&lt;/p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;976&quot; data-origin-height=&quot;102&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/rAK5F/dJMcagYAZtV/Ffwk3qU7rtkWryUGT0k9d1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/rAK5F/dJMcagYAZtV/Ffwk3qU7rtkWryUGT0k9d1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/rAK5F/dJMcagYAZtV/Ffwk3qU7rtkWryUGT0k9d1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FrAK5F%2FdJMcagYAZtV%2FFfwk3qU7rtkWryUGT0k9d1%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;976&quot; height=&quot;102&quot; data-origin-width=&quot;976&quot; data-origin-height=&quot;102&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;br&gt;&amp;nbsp;&lt;br&gt;자격증 정보와 시험 기준에 대한 정보는 아래 공홈을 참고하면 더 정확하다!&lt;br&gt;&amp;nbsp;&lt;br&gt;&lt;a href=&quot;https://www.dataq.or.kr/www/sub/a_02.do#none&quot; target=&quot;_blank&quot;&gt;&lt;span&gt;https://www.dataq.or.kr/www/sub/a_02.do#none&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;&lt;figure data-ke-type=&quot;opengraph&quot; data-og-title=&quot;데이터자격검정 - 데이터자격시험, DAP, DAsP, SQLP, SQLD, ADP, ADsP.&quot; data-ke-align=&quot;alignCenter&quot; data-og-description=&quot;데이터자격시험, DAP, DAsP, SQLP, SQLD, ADP, ADsP.&quot; data-og-host=&quot;www.dataq.or.kr&quot; data-og-source-url=&quot;https://www.dataq.or.kr/www/sub/a_02.do#none&quot; data-og-url=&quot;https://www.dataq.or.kr/www/main.do&quot;&gt;&lt;a href=&quot;https://www.dataq.or.kr/www/main.do&quot; target=&quot;_blank&quot; data-source-url=&quot;https://www.dataq.or.kr/www/sub/a_02.do#none&quot;&gt;&lt;div class=&quot;og-image&quot;&gt;&lt;/div&gt;&lt;div class=&quot;og-text&quot;&gt;&lt;p class=&quot;og-title&quot;&gt;데이터자격검정 - 데이터자격시험, DAP, DAsP, SQLP, SQLD, ADP, ADsP.&lt;/p&gt;&lt;p class=&quot;og-desc&quot;&gt;데이터자격시험, DAP, DAsP, SQLP, SQLD, ADP, ADsP.&lt;/p&gt;&lt;p class=&quot;og-host&quot;&gt;www.dataq.or.kr&lt;/p&gt;&lt;/div&gt;&lt;/a&gt;&lt;/figure&gt;&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;br&gt;&amp;nbsp;&lt;br&gt;&amp;nbsp;&lt;/p&gt;&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;background-color: #f6e199;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;2. 합격 인증 및 공부 방법&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;/h3&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;527&quot; data-origin-height=&quot;346&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bdt2wE/dJMcaaD6eZS/m24TqWNQQfz4birR9klmaK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bdt2wE/dJMcaaD6eZS/m24TqWNQQfz4birR9klmaK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bdt2wE/dJMcaaD6eZS/m24TqWNQQfz4birR9klmaK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbdt2wE%2FdJMcaaD6eZS%2Fm24TqWNQQfz4birR9klmaK%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;527&quot; height=&quot;346&quot; data-origin-width=&quot;527&quot; data-origin-height=&quot;346&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;나는 2025년에 58회차에 응시를 했다.&amp;nbsp;&lt;br&gt;가벼운 마음으로 공부를 시작했으나 문제때문에 고통을 꽤나 받아서 1트만 해보고 안되면 포기할 생각이였는데,&lt;br&gt;고맙게도 본 시험에서 문제가 술술 잘 풀렸고 기대이상의 높은 점수를 받아서 행복하게 책을 버릴 수 있게 되었다(?)&lt;br&gt;&amp;nbsp;&lt;br&gt;&amp;nbsp;&lt;br&gt;공부 방법은 그냥 정말 이론+실전문제 풀기 뿐이였다.&lt;br&gt;DAsP는 정말로 마이너한 자격증이여서 별로 시중에 나와있는 문제집 책도 없고 알려진 문제들도 없다.&lt;br&gt;이게 어떻게보면 참 막막할수도 있는데.. 오히려 책이 없으니 봐야할 책도 적고 명확해서 좋았다. (생각의 전환)&lt;/p&gt;&lt;figure class=&quot;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bx9NwV/dJMcabJNTC7/oJocPa4Do4wjD1YtYlCwhK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bx9NwV/dJMcabJNTC7/oJocPa4Do4wjD1YtYlCwhK/img.png&quot; data-origin-width=&quot;494&quot; data-origin-height=&quot;708&quot; style=&quot;width: 48.2492%;&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bx9NwV/dJMcabJNTC7/oJocPa4Do4wjD1YtYlCwhK/img.png&quot; alt=&quot;&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbx9NwV%2FdJMcabJNTC7%2FoJocPa4Do4wjD1YtYlCwhK%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;494&quot; height=&quot;708&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cY2Kv2/dJMcaiB57hl/2KfnYPKktonErWK8x75ZH1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cY2Kv2/dJMcaiB57hl/2KfnYPKktonErWK8x75ZH1/img.png&quot; data-origin-width=&quot;496&quot; data-origin-height=&quot;678&quot; style=&quot;width: 50.5881%;&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cY2Kv2/dJMcaiB57hl/2KfnYPKktonErWK8x75ZH1/img.png&quot; alt=&quot;&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcY2Kv2%2FdJMcaiB57hl%2F2KfnYPKktonErWK8x75ZH1%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;496&quot; height=&quot;678&quot;/&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;br&gt;&lt;i&gt; * 데이터 아키텍처 전문가 가이드 / 데이터아키텍처 자격검정 실전문제&lt;/i&gt;&lt;br&gt;&amp;nbsp;&lt;br&gt;나는 위의 2가지 책으로 공부했다. 하나는 이론이 담긴 두꺼운 책이고 하나는 실전문제집이다.&lt;br&gt;이 자격증에 대해 알아보신 분들은 알겠지만 책이 이거밖에 없다.&lt;br&gt;K data에서 공식적으로 나온 책이고, 놀랍게도 문제집은 2013년 버전이 가장 최신버전이다. (13년이나 흘렀네....)&lt;br&gt;&amp;nbsp;&lt;br&gt;최대한 공부기간은 짧고 굵게 가져가고 싶어서 2달로 잡았다.&lt;br&gt;직장병행+주말약속으로 순수 공부는 평일 저녁에만 진행했고&lt;br&gt;시험치기 1주 전만 주말에도 계속 문제를 풀고 또 풀면서 기억을 유지시켰다.&lt;br&gt;&amp;nbsp;&lt;br&gt;&amp;nbsp;&lt;br&gt;&lt;b&gt;우선 데이터아키텍처 전문가 가이드 책을 통해서 지루하지만 독서한다는 생각으로 그냥 1회독을 전체 다 훑었다.&lt;/b&gt;&lt;br&gt;관련 업을 하는 사람이라면 익숙한 내용들이라서 어렵지는 않을 것이다.&lt;br&gt;다만 나는 1과목의 전사 아키텍처 이해 부분이 정말 어려웠다. 너무 이론적이고 단순 암기해야하는 용어가 너무 많아서 고역이였다.&lt;br&gt;그래서 1과목 보는게 너무 오래걸렸고 나머지는 이미 실무에서도 쓰고 있기에 술술 익혀졌다.&lt;br&gt;&amp;nbsp;&lt;br&gt;&lt;b&gt;그 다음 과목별로 세부 내용별 중요도에 따라 특정 챕터만 더 유심하게 보았다.&lt;/b&gt;&lt;br&gt;데이터아키텍처 자격검정 실전문제 책에보면 중요도를 알려준다. 맨 앞장에 자격검정 안내를 보면 된다.&lt;br&gt;* 전사아키텍처 개요 &amp;gt; 전사아키텍처 정의 : 중요도 상&lt;br&gt;* 전사아키텍처 개요 &amp;gt; 전사아키텍처 프레임워크 : 중요도 중&lt;br&gt;* 정보 요구 사항 개요 &amp;gt; 정보 요구 사항 관리 : 중요도 중&lt;br&gt;...&lt;br&gt;이런식으로 표로 정리되어있는게 있다. 그래서 거기에서 중요도 상 으로 표시된 챕터를 좀 더 꼼꼼하게 봤다.&amp;nbsp;&lt;br&gt;&amp;nbsp;&lt;br&gt;&lt;b&gt;마지막으로는 그냥 전문가 가이드와 데이터 자격검정 실전문제에 있는 문제를 풀고 또 풀었다.&lt;/b&gt;&lt;br&gt;특히 실전문제를 풀고 오답노트가 중요하다. 답안지에 있는 해설을 보면서 왜 안되는지 왜 틀렸는지를 이해하고 넘어갈 것! (밑에 꿀팁 참고)&lt;br&gt;&amp;nbsp;&lt;br&gt;&amp;nbsp;&lt;br&gt;&amp;nbsp;&lt;br&gt;그리고.. 시험을 보고나서는 아래 네이버 카페에서&lt;br&gt;같은 회차의 시험을 본 사람들과 문제를 복기하면서 가채점을 해봤다.&lt;br&gt;진짜 헷갈리는 문제들이 넘 많아서 가채점 하면서 약간 슬펐다가 그냥 운명에 맡기기로 했던 기억이 난다..&lt;br&gt;&amp;nbsp;&lt;br&gt;&lt;a href=&quot;https://cafe.naver.com/sqlpd&quot; target=&quot;_blank&quot;&gt;&lt;span&gt;https://cafe.naver.com/sqlpd&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;&lt;figure data-ke-type=&quot;opengraph&quot; data-og-title=&quot;데이터 전문가 포럼 (빅데이터분석기사... : 네이버 카페&quot; data-ke-align=&quot;alignCenter&quot; data-og-description=&quot;빅데이터분석기사, ADP, ADsP, SQLP, SQLD, DAP, DAsP, BIS 자격증 취득 등 데이터 전문가 커뮤니티입니다.&quot; data-og-host=&quot;cafe.naver.com&quot; data-og-source-url=&quot;https://cafe.naver.com/sqlpd&quot; data-og-image=&quot;https://blog.kakaocdn.net/dna/cCBj4h/dJMb83knlXl/AAAAAAAAAAAAAAAAAAAAAAIihAag66FGzYnSBL-9ceTr1ejpKam30t15PBDNuDfb/img.jpg?credential=yqXZFxpELC7KVnFOS48ylbz2pIh7yKj8&amp;amp;expires=1769871599&amp;amp;allow_ip=&amp;amp;allow_referer=&amp;amp;signature=K59%2BmBFTCac9g66WHwHhg7ymV%2BI%3D&quot; data-og-url=&quot;https://cafe.naver.com/sqlpd&quot;&gt;&lt;a href=&quot;https://cafe.naver.com/sqlpd&quot; target=&quot;_blank&quot; data-source-url=&quot;https://cafe.naver.com/sqlpd&quot;&gt;&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://blog.kakaocdn.net/dna/cCBj4h/dJMb83knlXl/AAAAAAAAAAAAAAAAAAAAAAIihAag66FGzYnSBL-9ceTr1ejpKam30t15PBDNuDfb/img.jpg?credential=yqXZFxpELC7KVnFOS48ylbz2pIh7yKj8&amp;amp;expires=1769871599&amp;amp;allow_ip=&amp;amp;allow_referer=&amp;amp;signature=K59%2BmBFTCac9g66WHwHhg7ymV%2BI%3D')&quot;&gt; &lt;/div&gt;&lt;div class=&quot;og-text&quot;&gt;&lt;p class=&quot;og-title&quot;&gt;데이터 전문가 포럼 (빅데이터분석기사... : 네이버 카페&lt;/p&gt;&lt;p class=&quot;og-desc&quot;&gt;빅데이터분석기사, ADP, ADsP, SQLP, SQLD, DAP, DAsP, BIS 자격증 취득 등 데이터 전문가 커뮤니티입니다.&lt;/p&gt;&lt;p class=&quot;og-host&quot;&gt;cafe.naver.com&lt;/p&gt;&lt;/div&gt;&lt;/a&gt;&lt;/figure&gt;&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;br&gt;&amp;nbsp;&lt;br&gt;&amp;nbsp;아! 참고로 DAsP 책을 검색 하면 아래와 같은 책도 나오는데, (데이터아키텍처 준전문가 한 권으로 끝내기)&lt;br&gt;나는 별도로 보진 않았는데, 친구가 사서 본걸 보니까 이거는 정말 공부 1차적으로 다 끝낸사람이&lt;br&gt;이전 개념 복기하면서 외우는 용으로 사용할때 괜찮아 보이긴했다.&lt;br&gt;별도로 요약정리를 안했다면 시험장에 들고가는 용으로 괜찮을듯! 딱 모의고사에 나온 핵심 내용들을 짜깁기해서 만든 책이다.&lt;br&gt;But, 기본 지식이 없으면 진짜 뭔내용인지 모를정도로 자세한 설명은 없으니.. 이거만으로 끝내기에는 어려울듯&lt;/p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;499&quot; data-origin-height=&quot;703&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/XQw9C/dJMcai29oPQ/lScNtkFsyRKNoj49tNzFL1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/XQw9C/dJMcai29oPQ/lScNtkFsyRKNoj49tNzFL1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/XQw9C/dJMcai29oPQ/lScNtkFsyRKNoj49tNzFL1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FXQw9C%2FdJMcai29oPQ%2FlScNtkFsyRKNoj49tNzFL1%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;499&quot; height=&quot;703&quot; data-origin-width=&quot;499&quot; data-origin-height=&quot;703&quot;/&gt;&lt;/span&gt;&lt;/figure&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;background-color: #f6e199;&quot;&gt;&lt;b&gt;3. 꿀팁&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;br&gt;개인적으로 DAsP시험은.. 한마디로 말장난을 잘하는 시험이라고 생각 된다.&lt;br&gt;&amp;nbsp;&lt;br&gt;예를들어 수박이라는 과일에 대해 설명한 것 중 맞는것은? 이라는 지문이 있고&lt;br&gt;선택지에 (1) 수박은 과일이고 겉은 노란색이다. 라고 있을때, 앞에 수박은 과일이고~라는 말만 대충 읽고 답으로 선택 하면 틀린다.&amp;nbsp;&lt;br&gt;하나의 선택지에 항상 옳은것과 틀린것을 적절히 섞어서 놓기때문에 단어 하나하나 꼼꼼히 봐야지 오답을 줄일 수 있다.&lt;br&gt;&amp;nbsp;&lt;br&gt;또, '틀린 것을 모두 고르시오' 라고 하면 보통은 2개를 고르게 되는데 실제 정답의 갯수가 2개가 아닌 3개인 경우도 있다.&lt;br&gt;기본적인 시험에 대한 고정관념도 깨지는 경우가 많았다. 고통스러웠음,,,,ㅠ ㅋㅋㅋ&lt;br&gt;&amp;nbsp;&lt;br&gt;&amp;nbsp;&lt;br&gt;그리고 가장 중요한 것은..&lt;br&gt;이 시험은 문제와 답을 달달 외워서 되는 시험이 아니고&lt;br&gt;정말로 개념에 대해서 이해를 했는가에 대해 초점이 맞춰진 것 같다.&lt;br&gt;왜냐면.. 기출문제처럼 지문과 선택지가 토시하나 안틀리고 동일하게 나오지 않고 비슷한 용어를 쓰면서 나온다.&lt;br&gt;그래서 책에서 없었던 용어가 나오기도하고 (?) 실전문제 답안지의 해설에 있는 문장이 나오기도 한다.&lt;br&gt;&lt;b&gt;외워야겠다! 라기 보단 이해해야겠다! 라는 마음으로 접근하면 취득하는게 훨씬 수월 할 것 같다.&lt;/b&gt;&lt;br&gt;&amp;nbsp;&lt;br&gt;아무튼 DAsP공부하고 계신 분들 모두들 합격하시기를 !!!!!!!!!!!!!!!!!&lt;/p&gt;</description>
      <category>데이터베이스/DAsP</category>
      <category>DAP</category>
      <category>dasp</category>
      <category>데이터아키텍처</category>
      <category>데이터아키텍처준전문가</category>
      <category>자격증</category>
      <category>합격후기</category>
      <author>또또쪼</author>
      <guid isPermaLink="true">https://cceeun.tistory.com/396</guid>
      <comments>https://cceeun.tistory.com/396#entry396comment</comments>
      <pubDate>Mon, 26 Jan 2026 19:00:46 +0900</pubDate>
    </item>
    <item>
      <title>[SpringBoot] JPA로 DB 1:N 연관관계 설정하기 | @OneToMany, @ManyToOne 의미 | mappedBy란?</title>
      <link>https://cceeun.tistory.com/395</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;br&gt;A 클래스에서 B 클래스의 정보를 사용해야 할때, (DB로는 외래키 개념) JPA에서는 어떻게 설정하는지에 대해 적어보겠다.&lt;/p&gt;&lt;h3 data-ke-size=&quot;size23&quot;&gt;&amp;nbsp;&lt;/h3&gt;&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;1. 단방향 예제&lt;/b&gt;&lt;/h3&gt;&lt;pre data-ke-type=&quot;codeblock&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot;&gt;&lt;code&gt;@Entity
public class Restaurant {

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;@Id
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;@GeneratedValue
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;private Long id;

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;@ManyToOne
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;@JoinColumn(name = &quot;recommendation_history_id&quot;)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;private RecommendationHistory recommendationHistory;
}&lt;/code&gt;&lt;/pre&gt;&lt;p data-ke-size=&quot;size16&quot;&gt;식당을 추천하는 이력이 담는 로직이 있다고 치자. 그럼 이 소스의 의미는..&lt;br&gt;여러 Restaurant는 하나의 RecommendationHistory에 속한다.&lt;br&gt;외래키는 Restaurant 테이블에 생성된다.&lt;br&gt;&amp;nbsp;&lt;br&gt;&amp;nbsp;&lt;br&gt;&amp;nbsp;&lt;/p&gt;&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;2. 양방향 예제&lt;/b&gt;&lt;/h3&gt;&lt;p data-ke-size=&quot;size16&quot;&gt;하나의 추천이력 id 에는 여러개의 식당들이 나온다고 가정할 때, java 소스는 아래와 같다.&lt;br&gt;&amp;nbsp;&lt;br&gt;&lt;b&gt;(1) Resturant 클래스&lt;/b&gt;&lt;/p&gt;&lt;pre data-ke-type=&quot;codeblock&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot;&gt;&lt;code&gt;@ManyToOne
@JoinColumn(name = &quot;recommendation_history_id&quot;)
private RecommendationHistory recommendationHistory;&lt;/code&gt;&lt;/pre&gt;&lt;p data-ke-size=&quot;size16&quot;&gt;어노테이션까지 의미를 종합해보면..&lt;br&gt;“Restaurant 테이블에 recommendation_history_id 컬럼이 있고&lt;br&gt;이 컬럼은 RecommendationHistory의 PK를 참조한다. (= 저쪽 PK를 우리쪽 FK로 사용한다) (@JoinColumn) ”&lt;br&gt;&amp;nbsp;&lt;br&gt;&lt;b&gt;(2) RecommendationHistory 클래스&lt;/b&gt;&lt;/p&gt;&lt;pre data-ke-type=&quot;codeblock&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot;&gt;&lt;code&gt;@OneToMany(mappedBy = &quot;recommendationHistory&quot;,
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; cascade = CascadeType.ALL,
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; orphanRemoval = true)
@Builder.Default
private List&amp;lt;Restaurant&amp;gt; restaurants = new ArrayList&amp;lt;&amp;gt;();&lt;/code&gt;&lt;/pre&gt;&lt;p data-ke-size=&quot;size16&quot;&gt;이 소스를 해석해보면..&lt;br&gt;“RecommendationHistory 하나가 여러 개의 Restaurant를 가진다.&lt;br&gt;그리고 이 관계의 *주인은 Restaurant 쪽이다. (mappedBy) &quot;&lt;br&gt;&amp;nbsp;&lt;br&gt;&lt;i&gt;* 주인 = DB에서 FK 컬럼을 가진 엔티티&amp;nbsp; (객체의 주인, 부모/자식 개념이 아님!!)&lt;/i&gt;&lt;/p&gt;&lt;h3 data-ke-size=&quot;size23&quot;&gt;&amp;nbsp;&lt;/h3&gt;&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;3. 관계 방향별 어노테이션&lt;/b&gt;&lt;/h3&gt;&lt;table style=&quot;border-collapse: collapse; width: 57.093%;&quot; border=&quot;1&quot; data-ke-style=&quot;style4&quot; data-ke-align=&quot;alignLeft&quot;&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style=&quot;width: 30.5814%;&quot;&gt;1 : 1&lt;/td&gt;&lt;td style=&quot;width: 26.3953%;&quot;&gt;@OneToOne&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style=&quot;width: 30.5814%;&quot;&gt;1 : N&lt;/td&gt;&lt;td style=&quot;width: 26.3953%;&quot;&gt;@OneToMany&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style=&quot;width: 30.5814%;&quot;&gt;N : 1&lt;/td&gt;&lt;td style=&quot;width: 26.3953%;&quot;&gt;@ManyToOne&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style=&quot;width: 30.5814%;&quot;&gt;N : M&lt;/td&gt;&lt;td style=&quot;width: 26.3953%;&quot;&gt;@ManyToMany&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;br&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>프로그래밍/Spring Boot FW</category>
      <category>java</category>
      <category>Sprigboot</category>
      <category>springboot</category>
      <category>스프링부트</category>
      <author>또또쪼</author>
      <guid isPermaLink="true">https://cceeun.tistory.com/395</guid>
      <comments>https://cceeun.tistory.com/395#entry395comment</comments>
      <pubDate>Thu, 22 Jan 2026 21:16:32 +0900</pubDate>
    </item>
    <item>
      <title>[Spring Boot] @Controller 와 @RestController의 차이란? |  @ControllerAdvice, @RestControllerAdvice 과 AOP 차이</title>
      <link>https://cceeun.tistory.com/394</link>
      <description>&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;@Controller 와 @RestController의 차이란?&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;b&gt;1. @Controller&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;326&quot; data-start=&quot;303&quot;&gt;&lt;b&gt;서버 사이드 렌더링(MVC)&lt;/b&gt;&lt;/li&gt;
&lt;li data-end=&quot;366&quot; data-start=&quot;327&quot;&gt;JSP, Thymeleaf 같은 &lt;b&gt;View(html)&lt;/b&gt; 를 반환&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1768911891767&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;@Controller
public class TestController {

    @GetMapping(&quot;/test&quot;)
    public String test(Model model) {
        model.addAttribute(&quot;msg&quot;, &quot;hello&quot;);
        return &quot;test&quot;; // test.html or test.jsp
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;623&quot; data-start=&quot;597&quot;&gt;반환값 &quot;test&quot; --&amp;gt; &lt;b&gt;뷰 이름&lt;/b&gt;&lt;/li&gt;
&lt;li data-end=&quot;656&quot; data-start=&quot;624&quot;&gt;ViewResolver가 HTML 파일을 찾아서 렌더링&lt;/li&gt;
&lt;li data-end=&quot;656&quot; data-start=&quot;624&quot;&gt;Thymeleaf / JSP 사용, 서버에서&amp;nbsp; HTML 만들어서 내려줄 때 사용&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;데이터만 반환하고 싶으면 @ResponseBody를 메서드마다 붙여야한다.&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;b&gt;2. @RestController&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;861&quot; data-start=&quot;844&quot;&gt;&lt;b&gt;REST API 전용&lt;/b&gt;&lt;/li&gt;
&lt;li data-end=&quot;885&quot; data-start=&quot;862&quot;&gt;&lt;b&gt;JSON / XML 데이터&lt;/b&gt; 반환&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1768911957444&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;@RestController
public class ApiController {

    @GetMapping(&quot;/api/test&quot;)
    public String test() {
        return &quot;hello&quot;;
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;반환값 &quot;hello&quot; --&amp;gt; JSON 응답&lt;/li&gt;
&lt;li&gt;HTTP Response Body로 바로 내려감&lt;/li&gt;
&lt;li&gt;React , Vue 등에서 사용하고 또한 요즘 대부분의 백엔드 API는 다 이걸로함&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;&lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;그냥 쉽게 한 줄로 요약하면 !!!&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;@RestController =&amp;nbsp;@Controller&amp;nbsp;+&amp;nbsp;@ResponseBody&lt;/b&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 data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;엥 그러면 @ControllerAdvice랑 @RestControllerAdvice는 뭐지?&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;b&gt;3. @ControllerAdvice와 @RestControllerAdvice&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;~~Adivce 어노테이션은 여러 Controller에 공통으로 적용되는 로직을 한 곳에 모아두는 기능을 한다.&lt;/p&gt;
&lt;pre id=&quot;code_1768912197992&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;@RestControllerAdvice
public class GlobalExceptionHandler {

    @ExceptionHandler(NullPointerException.class)
    public String handleNPE(NullPointerException e) {
        return &quot;Null 포인터 에러 발생&quot;;
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;405&quot; data-start=&quot;357&quot;&gt;모든 @Controller, @RestController에 &lt;b&gt;자동 적용&lt;/b&gt;&lt;/li&gt;
&lt;li data-end=&quot;431&quot; data-start=&quot;406&quot;&gt;컨트롤러 코드에 &lt;b&gt;중복되는 로직 제거&lt;/b&gt;&lt;/li&gt;
&lt;li data-end=&quot;431&quot; data-start=&quot;406&quot;&gt;&lt;b&gt;&lt;b&gt;예외 처리 / 공통 데이터 바인딩 / 공통 설정&lt;/b&gt;&lt;/b&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;b&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;@RestControllerAdvice =&amp;nbsp;@ControllerAdvice&amp;nbsp;+&amp;nbsp;@ResponseBody&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;API서버는 왠만하면 다 @RestControllerAdvice를 쓴다고 보면된다.&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;b&gt;4. Controller에서 예외가 발생했을때 어떤 흐름으로 가나?&lt;/b&gt;&lt;b&gt;&lt;/b&gt;&lt;/h4&gt;
&lt;p data-end=&quot;1313&quot; data-start=&quot;1185&quot; data-ke-size=&quot;size16&quot;&gt;(1) Controller에서 예외 발생&lt;br /&gt;(2) DispatcherServlet이 예외 캐치&lt;br /&gt;(3) @ControllerAdvice의 @ExceptionHandler 검색&lt;br /&gt;(4) 있으면 실행&lt;br /&gt;(5) 응답 생성&lt;/p&gt;
&lt;p data-end=&quot;1354&quot; data-start=&quot;1315&quot; data-ke-size=&quot;size16&quot;&gt;참고로 @ControllerAdvice가 Controller 안의 try/catch보다 &lt;b&gt;우선순위 높음&lt;/b&gt;&lt;/p&gt;
&lt;p data-end=&quot;1354&quot; data-start=&quot;1315&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-end=&quot;1354&quot; data-start=&quot;1315&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-end=&quot;1354&quot; data-start=&quot;1315&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;5. @&lt;/b&gt;&lt;b&gt;RestControllerAdvice와 AOP의 차이&lt;/b&gt;&lt;/p&gt;
&lt;p data-end=&quot;1354&quot; data-start=&quot;1315&quot; data-ke-size=&quot;size16&quot;&gt;모든 컨트롤러에 공통으로 적용된다고 하니까 꼭 AOP와 비슷한 개념인거 같이 느껴졌다.&lt;/p&gt;
&lt;p data-end=&quot;1354&quot; data-start=&quot;1315&quot; data-ke-size=&quot;size16&quot;&gt;그치만 정확히는 AOP는 아니다.&lt;/p&gt;
&lt;p data-end=&quot;1354&quot; data-start=&quot;1315&quot; data-ke-size=&quot;size16&quot;&gt;아래 표를 보면 된다&lt;/p&gt;
&lt;p data-end=&quot;1354&quot; data-start=&quot;1315&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-end=&quot;1354&quot; data-start=&quot;1315&quot; data-ke-size=&quot;size16&quot;&gt;AOP는 거의 로깅/트랜잭션에 포커싱이 되어있고&lt;/p&gt;
&lt;p data-end=&quot;1354&quot; data-start=&quot;1315&quot; data-ke-size=&quot;size16&quot;&gt;@ControllerAdvice는 예외처리 중심이다.&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%; height: 101px;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot; data-ke-style=&quot;style12&quot;&gt;
&lt;tbody&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;height: 17px;&quot;&gt;&amp;nbsp;&lt;/td&gt;
&lt;td style=&quot;height: 17px;&quot;&gt;@ControllerAdvice&lt;/td&gt;
&lt;td style=&quot;height: 17px;&quot;&gt;AOP&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 21px;&quot;&gt;
&lt;td style=&quot;height: 21px;&quot;&gt;적용 대상&lt;/td&gt;
&lt;td style=&quot;height: 21px;&quot;&gt;Controller 전용&lt;/td&gt;
&lt;td style=&quot;height: 21px;&quot;&gt;모든 Bean&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 21px;&quot;&gt;
&lt;td style=&quot;height: 21px;&quot;&gt;주요 목적&lt;/td&gt;
&lt;td style=&quot;height: 21px;&quot;&gt;예외 / MVC 공통 처리&lt;/td&gt;
&lt;td style=&quot;height: 21px;&quot;&gt;로깅, 트랜잭션 등&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 21px;&quot;&gt;
&lt;td style=&quot;height: 21px;&quot;&gt;동작 시점&lt;/td&gt;
&lt;td style=&quot;height: 21px;&quot;&gt;요청 처리 중&lt;/td&gt;
&lt;td style=&quot;height: 21px;&quot;&gt;메서드 호출 전/후&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 21px;&quot;&gt;
&lt;td style=&quot;height: 21px;&quot;&gt;구현 방식&lt;/td&gt;
&lt;td style=&quot;height: 21px;&quot;&gt;Spring MVC 기능&lt;/td&gt;
&lt;td style=&quot;height: 21px;&quot;&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>프로그래밍/Spring Boot FW</category>
      <category>java</category>
      <category>Sprigboot</category>
      <category>sprinig</category>
      <category>스프링부트</category>
      <author>또또쪼</author>
      <guid isPermaLink="true">https://cceeun.tistory.com/394</guid>
      <comments>https://cceeun.tistory.com/394#entry394comment</comments>
      <pubDate>Tue, 20 Jan 2026 21:39:48 +0900</pubDate>
    </item>
    <item>
      <title>[Spring Boot] 의존성 주입시 final vs @Autowired 무엇이 더 좋을까?</title>
      <link>https://cceeun.tistory.com/393</link>
      <description>&lt;h2 data-path-to-node=&quot;2&quot; data-ke-size=&quot;size26&quot;&gt;1. DI(의존성 주입)의 구조와 흐름: final vs @Autowired&lt;/h2&gt;
&lt;p data-path-to-node=&quot;3&quot; data-ke-size=&quot;size16&quot;&gt;두 방식의 가장 큰 차이는 **&quot;객체가 언제 만들어지고, 언제 조립되느냐&quot;**의 시점 차이에 있습니다.&lt;/p&gt;
&lt;h3 data-path-to-node=&quot;4&quot; data-ke-size=&quot;size23&quot;&gt;① @Autowired (필드 주입)의 흐름&lt;/h3&gt;
&lt;p data-path-to-node=&quot;5&quot; data-ke-size=&quot;size16&quot;&gt;필드 주입은 객체를 먼저 만들고 나서 나중에 부품을 끼워 넣는 방식입니다.&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-path-to-node=&quot;6&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;6,0,0&quot;&gt;객체 생성:&lt;/b&gt; 스프링이 클래스를 보고 빈(Bean)을 생성합니다. 이때는 &lt;b data-index-in-node=&quot;40&quot; data-path-to-node=&quot;6,0,0&quot;&gt;기본 생성자&lt;/b&gt;를 사용해 일단 '빈 껍데기' 객체를 만듭니다.&lt;/li&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;6,1,0&quot;&gt;의존성 탐색:&lt;/b&gt; 객체 생성이 끝난 후, @Autowired가 붙은 필드를 확인합니다.&lt;/li&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;6,2,0&quot;&gt;주입:&lt;/b&gt; 스프링 컨테이너에서 알맞은 부품(빈)을 찾아 **리플렉션(Reflection)**이라는 기술을 써서 필드에 강제로 꽂아 넣습니다.&lt;/li&gt;
&lt;/ol&gt;
&lt;blockquote data-path-to-node=&quot;7&quot; data-ke-style=&quot;style1&quot;&gt;
&lt;p data-path-to-node=&quot;7,0&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;7,0&quot;&gt;비유:&lt;/b&gt; 완성된 자동차 차체를 먼저 만들고, 나중에 엔진을 본닛 열고 억지로 집어넣는 것과 같습니다.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3 data-path-to-node=&quot;8&quot; data-ke-size=&quot;size23&quot;&gt;② final + 생성자 주입의 흐름 (우리가 쓰는 방식)&lt;/h3&gt;
&lt;p data-path-to-node=&quot;9&quot; data-ke-size=&quot;size16&quot;&gt;생성자 주입은 객체를 만드는 &lt;b data-index-in-node=&quot;16&quot; data-path-to-node=&quot;9&quot;&gt;순간&lt;/b&gt;에 부품이 없으면 아예 조립을 시작하지 않는 방식입니다.&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-path-to-node=&quot;10&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;10,0,0&quot;&gt;의존성 탐색:&lt;/b&gt; 스프링이 빈을 생성하기 위해 생성자를 확인합니다. 생성자에 필요한 부품(인자)이 무엇인지 먼저 파악합니다.&lt;/li&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;10,1,0&quot;&gt;부품 준비:&lt;/b&gt; 컨테이너에서 필요한 부품들을 먼저 꺼내옵니다.&lt;/li&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;10,2,0&quot;&gt;객체 생성 및 주입:&lt;/b&gt; 준비된 부품들을 생성자에 넣으면서 &lt;b data-index-in-node=&quot;31&quot; data-path-to-node=&quot;10,2,0&quot;&gt;객체를 생성&lt;/b&gt;합니다. 객체가 태어나는 순간 이미 모든 부품이 장착되어 있습니다.&lt;/li&gt;
&lt;/ol&gt;
&lt;blockquote data-path-to-node=&quot;11&quot; data-ke-style=&quot;style1&quot;&gt;
&lt;p data-path-to-node=&quot;11,0&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;11,0&quot;&gt;비유:&lt;/b&gt; 레고 성을 만들 때, 기초 블록(부품)이 없으면 성 자체를 쌓기 시작할 수 없는 것과 같습니다.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;둘중에 무엇이 더 좋냐고 하면,,, final + 생성자 주입이다.&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;ol style=&quot;list-style-type: decimal;&quot; data-path-to-node=&quot;5&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;5,0,0&quot;&gt;불변성 (Immutability):&lt;/b&gt; final로 선언하면 객체가 생성될 때 한 번 주입되고 나서 절대로 바꿀 수 없습니다. 실행 중에 의존성이 변하는 사고를 원천 봉쇄합니다.&lt;/li&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;5,1,0&quot;&gt;누락 방지 (컴파일 타임 체크):&lt;/b&gt; 필드 주입(@Autowired)은 객체만 생성하고 의존성 주입을 깜빡해도 컴파일 에러가 안 날 수 있습니다. 하지만 생성자 주입은 의존성이 없으면 아예 객체 생성이 안 되므로 실행 전에 에러를 잡을 수 있습니다.&lt;/li&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;5,2,0&quot;&gt;테스트 용이성:&lt;/b&gt; 스프링 없이 순수 자바 코드로 단위 테스트를 짤 때, 생성자에 Mock(가짜) 객체를 직접 넣어줄 수 있어 매우 편리합니다.&lt;/li&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;5,3,0&quot;&gt;순환 참조 방지:&lt;/b&gt; 두 클래스가 서로를 참조하는 '순환 참조' 문제가 있을 때, 생성자 주입은 앱이 뜨는 시점에 바로 에러를 뱉어주어 문제를 빨리 알 수 있게 해줍니다.&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Lombok을 통해 생성자 자동생성 어노테이션 @RequiredArgsConstructor 해주면 굳&lt;/p&gt;</description>
      <category>프로그래밍/Spring Boot FW</category>
      <category>java</category>
      <category>springboot</category>
      <author>또또쪼</author>
      <guid isPermaLink="true">https://cceeun.tistory.com/393</guid>
      <comments>https://cceeun.tistory.com/393#entry393comment</comments>
      <pubDate>Thu, 15 Jan 2026 14:34:17 +0900</pubDate>
    </item>
  </channel>
</rss>