<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <title>dev-xong.log</title>
        <link>https://velog.io/</link>
        <description>백엔드 개발요정</description>
        <lastBuildDate>Mon, 11 May 2026 14:09:53 GMT</lastBuildDate>
        <docs>https://validator.w3.org/feed/docs/rss2.html</docs>
        <generator>https://github.com/jpmonette/feed</generator>
        <image>
            <title>dev-xong.log</title>
            <url>https://velog.velcdn.com/images/dev-xong/profile/ca40d1de-0c95-43c1-b4ef-241176c2d352/social_profile.jpeg</url>
            <link>https://velog.io/</link>
        </image>
        <copyright>Copyright (C) 2019. dev-xong.log. All rights reserved.</copyright>
        <atom:link href="https://v2.velog.io/rss/dev-xong" rel="self" type="application/rss+xml"/>
        <item>
            <title><![CDATA[[살아남기]백엔드 공부와 AI를 어떻게 활용할 수 있을까]]></title>
            <link>https://velog.io/@dev-xong/%EC%82%B4%EC%95%84%EB%82%A8%EA%B8%B0%EB%B0%B1%EC%97%94%EB%93%9C-%EA%B3%B5%EB%B6%80%EC%99%80-AI%EB%A5%BC-%EC%96%B4%EB%96%BB%EA%B2%8C-%ED%99%9C%EC%9A%A9%ED%95%A0-%EC%88%98-%EC%9E%88%EC%9D%84%EA%B9%8C</link>
            <guid>https://velog.io/@dev-xong/%EC%82%B4%EC%95%84%EB%82%A8%EA%B8%B0%EB%B0%B1%EC%97%94%EB%93%9C-%EA%B3%B5%EB%B6%80%EC%99%80-AI%EB%A5%BC-%EC%96%B4%EB%96%BB%EA%B2%8C-%ED%99%9C%EC%9A%A9%ED%95%A0-%EC%88%98-%EC%9E%88%EC%9D%84%EA%B9%8C</guid>
            <pubDate>Mon, 11 May 2026 14:09:53 GMT</pubDate>
            <description><![CDATA[<p>폐쇄망 환경에서 개발하다보니 AI를 활용한 실무 적용은 다른 세상 이야기 같지만 흐린눈 하며 살기에는 밥벌이가 위험해 질 것 같다.</p>
<p>기존엔 퇴근후에 사이드 프로젝트를 하고 있었는데 
클로드, 제미나이를 활용하면 초등학생 같은 나의 언어 구사력으로도 기깔나게 짜주는 코드를 볼 수 있었다.
내가 하는거라곤 [해줘 -&gt; 오 -&gt; 확인이나 해볼까] 뿐이였어서 
지식의 양이 느는 것도, 개발 실력이 느는것도 아니여서 현타가 좀 왔었다.</p>
<p>이대로 죽을 순 없어.</p>
<p>생각해낸 공부방법은 책 + AI 를 활용하는 것이다.
<img src="https://velog.velcdn.com/images/dev-xong/post/118de93a-7029-4d34-aba7-7ccf6b5e8ff8/image.JPG" alt="">
내가 고른 책은 [주니어 백엔드 개발자가 반드시 알아야 할 실무 지식]으로 
챕터별로 주니어 개발자가 알아두면 좋은 지식들과 상황들이 잘 정리되어 있다.</p>
<p>2장에는 서버 성능 최적화에 관한 내용을 다루는데, 
먼저 이런식으로 내가 책에서 공부한 내용을 정리하고
<img src="https://velog.velcdn.com/images/dev-xong/post/8e9d680f-2c25-4c3a-ab3f-74eea71d1962/image.png" alt=""></p>
<p>위에 정리한 내용과 같이 아래 사진처럼 claude에 요청했다.</p>
<p><img src="https://velog.velcdn.com/images/dev-xong/post/4df05bb5-7c5d-47ae-889c-107c581dc6db/image.png" alt=""></p>
<p>클로드가 큰 챕터별로 다양한 케이스를 심플하게 구현해주었다.api 테스트도 해보며 실제 구현 코드도 확인해볼 수 있었다. </p>
<p>글로 배운 내용을 실제 확인해보고 코드로 볼 수 있다는 점에서 앞에 하던 AI 딸깍 바이브 코딩할때와는 다르게 배우는게 있고 재밌다고 느껴졌다.</p>
<p><img src="https://velog.velcdn.com/images/dev-xong/post/c60d69f4-3830-43c6-a0cf-7a98bbc35c3d/image.png" alt=""></p>
<p>이정도 년차엔 당연히 이정도는 구현할 줄 알아야겠지 하는 조바심에 사전지식과 배경지식없이 AI를 업고 무턱대고 덤볐다. 시간과 에너지는 많이 쏟은 것 같은데 남는거라고는 별로 쳐다보고 싶지 않은 코드들과 허무함 뿐이였는데, 이번에는 조금 달랐다.</p>
<p>단순해 보이는 활용법이라 시시해 보일 수 있지만
일단은 지금과 같은 방식으로 저 책 하나를 완주하는게 목표다!</p>
<p>이렇게 배우게되는 지식들도, 좋은 방법들도 차근차근 포스팅 해내가보려한다!</p>
<p>나처럼 AI시대에 갈피 잡는게 힘들지만 뭐든 해보려하는 주니어 개발자들에게 도움이 되었으면 한다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[Spring Legacy]필수파라미터 누락 대응 (feat 속상함 풀이)]]></title>
            <link>https://velog.io/@dev-xong/Spring-Legacy-%ED%95%84%EC%88%98%ED%8C%8C%EB%9D%BC%EB%AF%B8%ED%84%B0-%EB%88%84%EB%9D%BD-%EB%8C%80%EC%9D%91-feat-%EC%86%8D%EC%83%81%ED%95%A8-%ED%92%80%EC%9D%B4</link>
            <guid>https://velog.io/@dev-xong/Spring-Legacy-%ED%95%84%EC%88%98%ED%8C%8C%EB%9D%BC%EB%AF%B8%ED%84%B0-%EB%88%84%EB%9D%BD-%EB%8C%80%EC%9D%91-feat-%EC%86%8D%EC%83%81%ED%95%A8-%ED%92%80%EC%9D%B4</guid>
            <pubDate>Fri, 10 Apr 2026 07:52:55 GMT</pubDate>
            <description><![CDATA[<p>시스템 담당자로 웹 로그 확인중에 에러가 발생한걸 확인했다</p>
<pre><code>java.sql.SQLException: Error: excuteQueryForObject returned too many results.</code></pre><p>쿼리 결과를 하나만 기대했는데 여러행이 나와서 터진 에러였고
원인은 필수 파라미터 누락이였다.</p>
<p>시스템 범용적으로 적용할 수 있는 방법으로</p>
<p>@RequiredParam 커스텀 어노테이션 및 HandlerInterceptor를 활용하여 요청이 오면 필수파라미터 여부를 검증할 수 있도록 설계했다.</p>
<ol>
<li><p>HandlerInterceptor 코드</p>
<pre><code>public class RequiredParamInterceptor extends HandlerInterceptorAdapter {

 @Override
 public boolean preHandle(HttpServletRequest request,
                         HttpServletResponse response,
                         Object handler) throws Exception {

     // Spring Legacy는 handler가 컨트롤러 인스턴스로 넘어옴
     // URL로 실제 메서드를 찾아서 어노테이션 확인
     String requestURI = request.getRequestURI();

     Method[] methods = handler.getClass().getMethods();
     for (Method method : methods) {
         RequestMapping requestMapping = method.getAnnotation(RequestMapping.class);
         if (requestMapping != null) {
             for (String value : requestMapping.value()) {
                 if (requestURI.contains(value)) {
                     RequiredParams annotation = method.getAnnotation(RequiredParams.class);
                     if (annotation == null) return true;

                     for (String param : annotation.value()) {
                         String paramValue = request.getParameter(param);
                         if (paramValue == null || paramValue.trim().isEmpty()) {
                             response.setStatus(HttpServletResponse.SC_BAD_REQUEST);
                             response.setContentType(&quot;application/json;charset=UTF-8&quot;);
                             response.getWriter().write(
                                 &quot;{\&quot;result\&quot;:\&quot;FAIL\&quot;, \&quot;message\&quot;:\&quot;필수 파라미터 누락: &quot; + param + &quot;\&quot;}&quot;
                             );
                             return false;
                         }
                     }
                     return true;
                 }
             }
         }
     }
     return true;
 }
}</code></pre></li>
<li><p>커스텀 어노테이셔 코드</p>
<pre><code>@Target(ElmentType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @Interface RequiredParams {
 String[] value();
}</code></pre></li>
<li><p>컨트롤러 적용 코드</p>
<pre><code>@RequiredParams({&quot;ntt_id&quot;})
@RequestMapping(&quot;/view.do&quot;)
public String view( @ModelAttribute(&quot;searchVO&quot;) BoardVO boardVO, 
                 ModelMap model) throws Exception {

</code></pre></li>
</ol>
<p>}</p>
<pre><code>
이렇게 적용하고, 필수파라미터 없이 해당 컨트롤러 요청시
Exception 에러가 아닌 URL과 필수파라미터 정보를 로그로 확인할 수 있다.
( 이미 알겠지만 해당 인터셉터를 로그 설정 파일에서 설정해야한다)
</code></pre><p>2026/04/28 13:11:43,342 [INFO] [com.cmm.interceptor.RequiredParamInterceptor] [http-nio-8080-exec-7] -
필수 파라미터 누락 URL : url 정보, 파라미터 : ntt_id</p>
<p>```</p>
<p>일단 포스팅 알맹이는 이렇다. 정보공유 및 기록의 목적도 있지만 한풀이 목적도 있다.</p>
<p>PM님께서 시스템 범용적으로 필수파라미터 누락 대응을 위한 방법을 찾아보라하셨고, 위의 내용을 PPT로 작성해서 보고드렸는데 아무런 피드백이 없으셨다. 그리고 좀 뒤에 동료와 나를 부른 후 스프링벨리데이션을 활용해서 필수파라미터 누락에 대응하는 방법을 찾아서 보고하라하셨다.</p>
<p>보고드린 방식에는 일언반구도 없으시고 이 방법은 해당하지 않는지 궁금해서 보고드린 방식은 해당이 안되는지 여쭤보았는데, ppt 열어보시더니 &#39;이렇게 해도 상관은 없죠, oo주임(나)은 다른 방법 필요없으신 것 같은데 그럼 알아보지 마세요&#39; 이런식으로 피드백이 돌아왔다.</p>
<p>그리고 같이 부른 동료에게 &#39;oo씨만 스프링벨리데이션으로 적용하는 방법 찾아서 보고하세요&#39; 이러길래 ???? 물음표만 띄우고 기분만 상한채 자리로 돌아왔다.</p>
<p><img src="https://velog.velcdn.com/images/dev-xong/post/0ba6f2b1-daf5-4629-9a23-cdadf300eaaf/image.png" alt=""></p>
<p>그냥 여기에서라도 알아달라고 포스팅을 해본다...
이런식의 억울하고 속상한 일이 한두번이 아니였지만
이 사건 이후로 열심히 잘하고 싶은 생각도 안들고, 상기할 수록 
나만 힘든걸 알지만 며칠 내도록 속상해서 일상이 힘든 요즘이다.
<img src="https://velog.velcdn.com/images/dev-xong/post/07aceee0-62d6-409d-a5f1-5ae1350b56b0/image.jpg" alt=""></p>
<p>직급도 낮고 부하직원이지만 나도 직장동료인데,
본인의 권위와 말이 가장 중요한 사람 밑에서 그냥 밟히는 것 같다.</p>
]]></description>
        </item>
    </channel>
</rss>