<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>메리</title>
    <link>https://mchch.tistory.com/</link>
    <description></description>
    <language>ko</language>
    <pubDate>Sun, 5 Apr 2026 13:22:23 +0900</pubDate>
    <generator>TISTORY</generator>
    <ttl>100</ttl>
    <managingEditor>메리짱123</managingEditor>
    <item>
      <title>[Springboot] OncePerRequestFilter로 커스텀 필터 설정</title>
      <link>https://mchch.tistory.com/367</link>
      <description>&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;* &amp;nbsp;OncePerRequestFilter 를 상속한 커스텀 필터는 대체로 SecurityFilterChain에서 맨 앞쪽에 배치됨.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;* 혹은 SecurityFilterChain에서 .addFilterBefore()나 .addFilterAfter 등으로 위치 지정 가능&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;* filterChain.doFilter(request, response)를 호출해야 다음 필터 또는 dispatcherServlet으로 전달됨&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;* JWT filter에서 예외가 발생하면 catch 로 잡아서 doFilter를 하여도 전의 corsfilter에서 달았던 cors 관련 헤더가 사라지는 현상 발생함&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. Request&lt;br /&gt;2. CorsFilter (CORS 헤더 준비후에 filterChain.doFilter) &lt;br /&gt;3. JwtFilter (JWT 토큰 검증하여 SecurityContextHolder세팅후&amp;nbsp; filterChain.doFilter)&lt;br /&gt;4. UsernamePasswordAuthenticationFilter(앞에서 인증실패하여&amp;nbsp; SecurityContextHolder 없는 경우 username과 password로 세팅)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;5. AuthenticationManager 에서 username 이 빈 문자열이면 BadCredentialsException 발생, 던짐&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;6. ExceptionTranslationFilter에서 AuthenticationException으로 잡힘&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;7. AuthenticationEntryPoint를 통해 처리되는 과정중 sendError 호출 -&amp;gt; 컨테이너가 응답을 새로 쓰는 과정에서 사라짐&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;sendError를 호출하게 되면 톰캣이 응답을 작성하기 때문에 Spring Security가 세팅해둔 cors 헤더나 json본문이 날아감.&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;pre id=&quot;code_1756372576634&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;@Component
@RequiredArgsConstructor
@Slf4j
public class JwtAuthenticationFilter extends OncePerRequestFilter {

    private final JwtService jwtService;
    private final Environment env;

    @Override
    protected void doFilterInternal(final HttpServletRequest request,
            @NotNull final HttpServletResponse response,
            @NotNull final FilterChain filterChain)
            throws ServletException, IOException {
        String accessToken = request.getHeader(&quot;Authorization&quot;);

        if (StringUtils.isNotEmpty(accessToken)) {
            try {
                Claims claim = jwtService.getClaims(accessToken);
                if (claim != null) {
                    //인증된 사용자로 설정
                    SecurityContextHolder.getContext().setAuthentication(jwtService.getAuthenticationFromClaim(claim));
                } else {
                    throw new IllegalArgumentException(&quot;Claims is null&quot;);
                }
            } catch (ExpiredJwtException e) {
                log.debug(&quot;TOKEN IS EXPIRED&quot;);
                setErrorCodeAndMessage(response, EXPIRED_TOKEN);
                return;
            } catch (Exception e) {
                log.debug(&quot;FAILED TO GET TOKEN INFORMATION.&quot;);
                setErrorCodeAndMessage(response, INVALID_TOKEN);
                return;
            }

        }

        filterChain.doFilter(request, response);
    }

    //token 관련 에러코드와 메세지를 응답에 세팅
    private void setErrorCodeAndMessage(HttpServletResponse response, ErrorCode errorCode) {
        try {
            TBResponse tbResponse = TBResponse.failed(errorCode);
            ObjectMapper objectMapper = new ObjectMapper();
            String json = objectMapper.writeValueAsString(tbResponse);

            if (!Arrays.asList(env.getActiveProfiles()).contains(&quot;prod&quot;)) {
                response.setContentType(&quot;application/json;charset=UTF-8&quot;);
                response.addHeader(&quot;Access-Control-Allow-Origin&quot;, &quot;*&quot;);
            }
            response.addHeader(&quot;Access-Control-Allow-Credentials&quot;, &quot;true&quot;);
            response.addHeader(&quot;Access-Control-Allow-Methods&quot;, &quot;GET, POST, DELETE, PUT&quot;);
            response.addHeader(&quot;Access-Control-Allow-Headers&quot;,
                    &quot;Origin, Accept, X-Requested-With, Content-Type, Access-Control-Request-Method, Access-Control-Request-Headers, Authorization&quot;);
            response.addHeader(&quot;Access-Control-Expose-Headers&quot;,
                    &quot;Access-Control-Allow-Origin, Access-Control-Allow-Credentials, Content-Disposition&quot;);
            response.addIntHeader(&quot;Access-Control-Max-Age&quot;, 10);
            response.getWriter().write(json);

        } catch (Exception e) {
            log.warn(&quot;&quot;);
        }
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>코딩 관련/Spring 관련</category>
      <author>메리짱123</author>
      <guid isPermaLink="true">https://mchch.tistory.com/367</guid>
      <comments>https://mchch.tistory.com/367#entry367comment</comments>
      <pubDate>Thu, 28 Aug 2025 20:07:56 +0900</pubDate>
    </item>
    <item>
      <title>JVM 인코딩 / Tomcat 인코딩 / Springboot 인코딩 / 서버 인코딩</title>
      <link>https://mchch.tistory.com/361</link>
      <description>&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;API로 서버에서 읽어오는 한글 텍스트가 자꾸 깨지는 거임..&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;Spring boot yml 파일에도 설정해보고 Tomcat 설정도 해봤는데 JVM 인코딩 설정하니 됐음..&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h2 style=&quot;text-align: left;&quot; data-ke-size=&quot;size26&quot;&gt;tomcat 인코딩 설정&lt;/h2&gt;
&lt;h4 style=&quot;text-align: left;&quot; data-ke-size=&quot;size20&quot;&gt;server.xml 설정&lt;/h4&gt;
&lt;pre id=&quot;code_1747907472565&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;Connector port=&quot;8080&quot; URIEncoding=&quot;UTF-8&quot; ... /&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;text-align: left;&quot; 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;332&quot; data-start=&quot;288&quot;&gt;&lt;b&gt;적용 대상&lt;/b&gt;: &lt;b&gt;요청(Request)의 URL(쿼리 파라미터 등)&lt;/b&gt;&lt;/li&gt;
&lt;li data-end=&quot;396&quot; data-start=&quot;333&quot;&gt;예: /search?query=한글에서 query=한글 &amp;rarr; 이 값을 Tomcat이 UTF-8로 해석함.&lt;/li&gt;
&lt;li data-end=&quot;446&quot; data-start=&quot;397&quot;&gt;&lt;b&gt;주의&lt;/b&gt;: POST body의 form data나 JSON에는 적용되지 않음.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 style=&quot;text-align: left;&quot; data-ke-size=&quot;size20&quot;&gt;web.xml 설정&lt;/h4&gt;
&lt;pre id=&quot;code_1747907605772&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;filter&amp;gt;
  &amp;lt;filter-name&amp;gt;encodingFilter&amp;lt;/filter-name&amp;gt;
  &amp;lt;filter-class&amp;gt;org.springframework.web.filter.CharacterEncodingFilter&amp;lt;/filter-class&amp;gt;
  &amp;lt;init-param&amp;gt;
    &amp;lt;param-name&amp;gt;encoding&amp;lt;/param-name&amp;gt;
    &amp;lt;param-value&amp;gt;UTF-8&amp;lt;/param-value&amp;gt;
  &amp;lt;/init-param&amp;gt;
  &amp;lt;init-param&amp;gt;
    &amp;lt;param-name&amp;gt;forceEncoding&amp;lt;/param-name&amp;gt;
    &amp;lt;param-value&amp;gt;true&amp;lt;/param-value&amp;gt;
  &amp;lt;/init-param&amp;gt;
&amp;lt;/filter&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;text-align: left;&quot; 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;1230&quot; data-start=&quot;1133&quot;&gt;&lt;b&gt;적용 대상&lt;/b&gt;:
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;1230&quot; data-start=&quot;1148&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;1191&quot; data-start=&quot;1148&quot;&gt;&lt;b&gt;요청 body 파라미터 인코딩&lt;/b&gt; (POST, PUT form)&lt;/li&gt;
&lt;li data-end=&quot;1230&quot; data-start=&quot;1194&quot;&gt;&lt;b&gt;응답 헤더의 Content-Type charset 설정&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li data-end=&quot;1393&quot; data-start=&quot;1231&quot;&gt;Spring Boot에서는 application.yml에서 아래로 대체 가능&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1747907658684&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;spring:
  http:
    encoding:
      charset: UTF-8
      enabled: true
      force: true&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h2 style=&quot;text-align: left;&quot; data-ke-size=&quot;size26&quot;&gt;JVM 인코딩 설정&lt;/h2&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;JVM 내부에서 기본 문자 인코딩으로 사용됨&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;톰캣경로/bin/setenv.sh 파일에 설정하였음&lt;/p&gt;
&lt;pre id=&quot;code_1747908174861&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;export JAVA_OPTS=&quot;$JAVA_OPTS -Dfile.encoding=UTF-8&quot;&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;setenv.sh : Tomcat 실행 시 JVM 옵션이나 환경변수를 설정하는 스크립트&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; 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;247&quot; data-start=&quot;86&quot;&gt;&lt;b&gt;Java 표준 입출력(I/O) 기본 인코딩&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;247&quot; data-start=&quot;122&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;201&quot; data-start=&quot;122&quot;&gt;예를 들어 new InputStreamReader(someStream) 처럼 인코딩을 명시하지 않을 때 기본 인코딩으로 사용&lt;/li&gt;
&lt;li data-end=&quot;247&quot; data-start=&quot;205&quot;&gt;파일 입출력, 콘솔 출력, 로그 기록 등에서 기본 인코딩 기준이 됨&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li data-end=&quot;367&quot; data-start=&quot;249&quot;&gt;&lt;b&gt;애플리케이션이 명시적으로 인코딩을 지정하지 않은 경우의 문자열 처리&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;367&quot; data-start=&quot;299&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;367&quot; data-start=&quot;299&quot;&gt;예를 들어, new String(byteArray) 처럼 인코딩을 지정하지 않으면 JVM 기본 인코딩을 사용&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li data-end=&quot;500&quot; data-start=&quot;369&quot;&gt;&lt;b&gt;톰캣이나 스프링이 처리하기 전에 JVM 내부에서 문자 데이터를 다루는 기본 인코딩&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;500&quot; data-start=&quot;427&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;500&quot; data-start=&quot;427&quot;&gt;톰캣이나 스프링 필터 전에 JVM 레벨에서의 인코딩 기준 역할을 하므로, JVM 인코딩이 달라서 문제 발생하는 경우도 있음&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;서버 인코딩 확인&lt;/h2&gt;
&lt;pre id=&quot;code_1747907898174&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;locale&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;357&quot; data-origin-height=&quot;228&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cF6eZO/btsN9DO5ZGj/viOyzkaS7SCU4jZdrsJbbK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cF6eZO/btsN9DO5ZGj/viOyzkaS7SCU4jZdrsJbbK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cF6eZO/btsN9DO5ZGj/viOyzkaS7SCU4jZdrsJbbK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcF6eZO%2FbtsN9DO5ZGj%2FviOyzkaS7SCU4jZdrsJbbK%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;357&quot; height=&quot;228&quot; data-origin-width=&quot;357&quot; data-origin-height=&quot;228&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;요약&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;552&quot; data-start=&quot;344&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;391&quot; data-start=&quot;344&quot;&gt;&lt;b&gt;JVM 인코딩&lt;/b&gt;: 내부 기본 문자셋, 파일 I/O, 콘솔 출력 등에 영향&lt;/li&gt;
&lt;li data-end=&quot;435&quot; data-start=&quot;392&quot;&gt;&lt;b&gt;톰캣 인코딩&lt;/b&gt;: URL 파라미터, 요청 처리 입출력 인코딩에 영향&lt;/li&gt;
&lt;li data-end=&quot;478&quot; data-start=&quot;436&quot;&gt;&lt;b&gt;스프링 인코딩&lt;/b&gt;: HTTP 요청 바디, 응답 헤더에 인코딩 지정&lt;/li&gt;
&lt;li data-end=&quot;514&quot; data-start=&quot;479&quot;&gt;&lt;b&gt;운영체제 로케일&lt;/b&gt;: JVM 기본 인코딩에 간접 영향&lt;/li&gt;
&lt;li data-end=&quot;552&quot; data-start=&quot;515&quot;&gt;&lt;b&gt;클라이언트 인코딩&lt;/b&gt;: 요청 인코딩과 응답 처리에 직접 영향&lt;/li&gt;
&lt;/ul&gt;</description>
      <category>기타</category>
      <category>spring 인코딩</category>
      <category>Spring 한글깨짐</category>
      <category>springboot 인코딩</category>
      <category>tomcat 인코딩설정</category>
      <category>웹 인코딩설정</category>
      <category>웹 한글깨짐</category>
      <author>메리짱123</author>
      <guid isPermaLink="true">https://mchch.tistory.com/361</guid>
      <comments>https://mchch.tistory.com/361#entry361comment</comments>
      <pubDate>Thu, 22 May 2025 19:04:55 +0900</pubDate>
    </item>
    <item>
      <title>오늘의 글쓰기</title>
      <link>https://mchch.tistory.com/366</link>
      <description>&lt;p data-ke-size=&quot;size16&quot; style=&quot;text-align: left;&quot;&gt;며칠남았냐. ..&lt;br&gt;일하기싫다진짜&lt;/p&gt;</description>
      <category>오블완</category>
      <category>티스토리챌린지</category>
      <author>메리짱123</author>
      <guid isPermaLink="true">https://mchch.tistory.com/366</guid>
      <comments>https://mchch.tistory.com/366#entry366comment</comments>
      <pubDate>Wed, 27 Nov 2024 22:42:31 +0900</pubDate>
    </item>
    <item>
      <title>오늘의 글쓰기</title>
      <link>https://mchch.tistory.com/365</link>
      <description>&lt;p data-ke-size=&quot;size16&quot; style=&quot;text-align: left;&quot;&gt;오늘은 면접을 두 군데나 봤어&lt;br&gt;취준은 2개월가량 걸린다더니&lt;br&gt;정말 알아보기 시작한지 &lt;br&gt;2달정도 걸려서 면접을 보는구나&lt;br&gt;힘들다~&lt;/p&gt;</description>
      <category>오블완</category>
      <category>티스토리챌린지</category>
      <author>메리짱123</author>
      <guid isPermaLink="true">https://mchch.tistory.com/365</guid>
      <comments>https://mchch.tistory.com/365#entry365comment</comments>
      <pubDate>Tue, 26 Nov 2024 21:50:59 +0900</pubDate>
    </item>
    <item>
      <title>오늘의 글쓰기</title>
      <link>https://mchch.tistory.com/364</link>
      <description>&lt;p data-ke-size=&quot;size16&quot; style=&quot;text-align: left;&quot;&gt;오늘은 면접준비&lt;br&gt;내일 오전반차&lt;br&gt;내일 오전면접보구&lt;br&gt;퇴근 후 또 면접~&lt;/p&gt;</description>
      <category>오블완</category>
      <category>티스토리챌린지</category>
      <author>메리짱123</author>
      <guid isPermaLink="true">https://mchch.tistory.com/364</guid>
      <comments>https://mchch.tistory.com/364#entry364comment</comments>
      <pubDate>Mon, 25 Nov 2024 22:08:36 +0900</pubDate>
    </item>
    <item>
      <title>오늘의 글쓰기</title>
      <link>https://mchch.tistory.com/363</link>
      <description>&lt;p data-ke-size=&quot;size16&quot; style=&quot;text-align: left;&quot;&gt;오늘 홍대가서 잡템구경도하고&lt;br&gt;옷구경도 했다&lt;br&gt;무신사에서 엄청이쁜코트를 입어봤는데&lt;br&gt;코트 둘데가 없어서 안샀다&lt;br&gt;갖고싶다ㅠ&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;/p&gt;</description>
      <category>오블완</category>
      <category>티스토리챌린지</category>
      <author>메리짱123</author>
      <guid isPermaLink="true">https://mchch.tistory.com/363</guid>
      <comments>https://mchch.tistory.com/363#entry363comment</comments>
      <pubDate>Sat, 23 Nov 2024 21:00:33 +0900</pubDate>
    </item>
    <item>
      <title>오늘의 글쓰기</title>
      <link>https://mchch.tistory.com/362</link>
      <description>&lt;p data-ke-size=&quot;size16&quot; style=&quot;text-align: left;&quot;&gt;등촌 샤브샤브먹고&lt;br&gt;자라에서 블레이져 삼&lt;br&gt;생각보다 마니걸었다&lt;br&gt;힘틀당&lt;/p&gt;</description>
      <category>오블완</category>
      <category>티스토리챌린지</category>
      <author>메리짱123</author>
      <guid isPermaLink="true">https://mchch.tistory.com/362</guid>
      <comments>https://mchch.tistory.com/362#entry362comment</comments>
      <pubDate>Fri, 22 Nov 2024 23:07:50 +0900</pubDate>
    </item>
    <item>
      <title>Connection Timeout, SocketTimeout, ReadTimeout</title>
      <link>https://mchch.tistory.com/360</link>
      <description>&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;1. Connection Timeout&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;발생 시점&lt;/b&gt;: 서버와 &lt;b&gt;연결을 시도하는 과정&lt;/b&gt;에서 시간 초과 발생.&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;클라이언트가 서버에 연결 요청을 보냄 (CONNECT).&lt;/li&gt;
&lt;li&gt;서버가 응답하지 않거나 네트워크 문제로 연결이 지연.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Connection Timeout&lt;/b&gt; 설정 시간 초과 &amp;rarr; ConnectTimeoutException 발생.&lt;/li&gt;
&lt;/ol&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;예시&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&gt;서버 주소가 잘못 설정되어 DNS 조회 실패.&lt;/li&gt;
&lt;li&gt;서버가 다운되어 요청을 처리하지 못함.&lt;/li&gt;
&lt;li&gt;방화벽이 연결을 차단.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;2. Socket Timeout (응답 대기)&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;발생 시점&lt;/b&gt;: 연결이 성공한 후, &lt;b&gt;서버가 응답 데이터를 보내기 시작하지 않을 때&lt;/b&gt; 시간 초과 발생.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;전체&amp;nbsp;응답&amp;nbsp;시간이&amp;nbsp;아닌&amp;nbsp;개별&amp;nbsp;패킷&amp;nbsp;응답&amp;nbsp;시간&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;클라이언트가 서버와 연결 성공.&lt;/li&gt;
&lt;li&gt;서버는 요청을 받았으나 응답 처리가 지연됨.&lt;/li&gt;
&lt;li&gt;클라이언트가 &lt;b&gt;Socket Timeout&lt;/b&gt; 동안 대기했으나 데이터가 도착하지 않음 &amp;rarr; SocketTimeoutException 발생.&lt;/li&gt;
&lt;/ol&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;예시&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&gt;서버 과부하로 응답 지연.&lt;/li&gt;
&lt;li&gt;요청 처리 중 서버의 작업이 중단됨.&lt;/li&gt;
&lt;li&gt;네트워크 패킷이 손실됨.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;3. Read Timeout&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;발생 시점&lt;/b&gt;: 응답 데이터의 일부를 읽은 후, &lt;b&gt;남은 데이터를 끝까지 받지 못할 때&lt;/b&gt; 시간 초과 발생.&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;클라이언트가 서버와 연결 성공.&lt;/li&gt;
&lt;li&gt;서버가 일부 응답 데이터를 보내기 시작.&lt;/li&gt;
&lt;li&gt;응답 데이터의 나머지가 전송되지 않음.&lt;/li&gt;
&lt;li&gt;클라이언트가 &lt;b&gt;Read Timeout&lt;/b&gt; 동안 대기했으나 데이터 전송이 완료되지 않음 &amp;rarr; SocketTimeoutException 발생.&lt;/li&gt;
&lt;/ol&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;예시&lt;/b&gt;&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;대규모 데이터를 처리 중 네트워크 장애 발생.&lt;/li&gt;
&lt;li&gt;서버 응답이 중간에 중단됨.&lt;/li&gt;
&lt;li&gt;클라이언트가 데이터를 너무 빨리 읽으려 함.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;SocketTimeout = ReadTimeout&lt;/b&gt;:&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;두 용어는 Java에서 동일한 타임아웃 설정을 가리킵니다.&lt;/li&gt;
&lt;li&gt;둘 다 응답 데이터 읽기와 관련된 대기 시간을 제어합니다.&lt;/li&gt;
&lt;/ul&gt;</description>
      <category>connectionTimeout</category>
      <category>readTimeout</category>
      <category>sockettimeout</category>
      <category>오블완</category>
      <category>티스토리챌린지</category>
      <author>메리짱123</author>
      <guid isPermaLink="true">https://mchch.tistory.com/360</guid>
      <comments>https://mchch.tistory.com/360#entry360comment</comments>
      <pubDate>Wed, 20 Nov 2024 09:36:45 +0900</pubDate>
    </item>
    <item>
      <title>로컬에선 war -Pprofile=dev 가 안되는데 젠킨스에선 되는 이유</title>
      <link>https://mchch.tistory.com/359</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;1. build.gradle에서는 bootJar만 활성화 되어있음&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;806&quot; data-origin-height=&quot;558&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b6FNO1/btsN92nyV0A/rF3dQYklW0nOlnHZtfHJMk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b6FNO1/btsN92nyV0A/rF3dQYklW0nOlnHZtfHJMk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b6FNO1/btsN92nyV0A/rF3dQYklW0nOlnHZtfHJMk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb6FNO1%2FbtsN92nyV0A%2FrF3dQYklW0nOlnHZtfHJMk%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;346&quot; height=&quot;240&quot; data-origin-width=&quot;806&quot; data-origin-height=&quot;558&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. 그래서 war 설정을 추가해주어야 함&lt;/p&gt;
&lt;pre id=&quot;code_1747906874227&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;war {
    enabled = true                // war 활성화
}&lt;/code&gt;&lt;/pre&gt;
&lt;div class=&quot;revenue_unit_wrap&quot;&gt;
  &lt;div class=&quot;revenue_unit_item adsense responsive&quot;&gt;
    &lt;div class=&quot;revenue_unit_info&quot;&gt;반응형&lt;/div&gt;
    &lt;script src=&quot;//pagead2.googlesyndication.com/pagead/js/adsbygoogle.js&quot; async=&quot;async&quot;&gt;&lt;/script&gt;
    &lt;ins class=&quot;adsbygoogle&quot; style=&quot;display: block;&quot; data-ad-host=&quot;ca-host-pub-9691043933427338&quot; data-ad-client=&quot;ca-pub-2927666881756725&quot; data-ad-format=&quot;auto&quot;&gt;&lt;/ins&gt;
    &lt;script&gt;(adsbygoogle = window.adsbygoogle || []).push({});&lt;/script&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>코딩 관련/기타</category>
      <category>jar 빌드</category>
      <category>jar 생성</category>
      <category>war 말기</category>
      <category>war 빌드</category>
      <category>war 생성</category>
      <author>메리짱123</author>
      <guid isPermaLink="true">https://mchch.tistory.com/359</guid>
      <comments>https://mchch.tistory.com/359#entry359comment</comments>
      <pubDate>Sun, 17 Nov 2024 23:14:40 +0900</pubDate>
    </item>
    <item>
      <title>[프로그래머스] Lv1. 과일 장수</title>
      <link>https://mchch.tistory.com/358</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;1. 오름차순 정렬&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. 배열 오른쪽부터 m개씩 끊으면 끊은 지점이 그 구간에서 제일 싼가격임..&lt;/p&gt;
&lt;pre id=&quot;code_1731686685087&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import java.util.*;

class Solution {
    public int solution(int k, int m, int[] score) {
        Arrays.sort(score);
        int sum = 0;
        for (int i = score.length - m; i &amp;gt;= 0; i -= m) {
            sum += score[i] * m;
        }
        return sum;
    }
}&lt;/code&gt;&lt;/pre&gt;</description>
      <category>코딩 관련/코딩문제풀기</category>
      <author>메리짱123</author>
      <guid isPermaLink="true">https://mchch.tistory.com/358</guid>
      <comments>https://mchch.tistory.com/358#entry358comment</comments>
      <pubDate>Sat, 16 Nov 2024 01:11:11 +0900</pubDate>
    </item>
  </channel>
</rss>