<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <title>ksw_dev.log</title>
        <link>https://velog.io/</link>
        <description>헤헤</description>
        <lastBuildDate>Wed, 26 Mar 2025 06:02:55 GMT</lastBuildDate>
        <docs>https://validator.w3.org/feed/docs/rss2.html</docs>
        <generator>https://github.com/jpmonette/feed</generator>
        <image>
            <title>ksw_dev.log</title>
            <url>https://velog.velcdn.com/images/ksw_dev/profile/de36e2ae-ff0a-4b2d-b23c-2e4c7ebf26b9/image.png</url>
            <link>https://velog.io/</link>
        </image>
        <copyright>Copyright (C) 2019. ksw_dev.log. All rights reserved.</copyright>
        <atom:link href="https://v2.velog.io/rss/ksw_dev" rel="self" type="application/rss+xml"/>
        <item>
            <title><![CDATA[상태 컬럼의 애매모호함]]></title>
            <link>https://velog.io/@ksw_dev/%EC%83%81%ED%83%9C-%EC%BB%AC%EB%9F%BC%EC%9D%98-%EC%95%A0%EB%A7%A4%EB%AA%A8%ED%98%B8%ED%95%A8</link>
            <guid>https://velog.io/@ksw_dev/%EC%83%81%ED%83%9C-%EC%BB%AC%EB%9F%BC%EC%9D%98-%EC%95%A0%EB%A7%A4%EB%AA%A8%ED%98%B8%ED%95%A8</guid>
            <pubDate>Wed, 26 Mar 2025 06:02:55 GMT</pubDate>
            <description><![CDATA[<p>최근 아파트주민들의 투표 기능을 만들기 위해서</p>
<p>배치 스케줄러를 사용 했는데,</p>
<p>해당 배치 프로그램은</p>
<p>투표 시작과 종료는 30분 단위로만 설정 할 수 있어</p>
<p>배치서버에서 메인서버로 특정 API를 30분마다 반복해 전송,</p>
<p>메인서버에서 시작/종료 하는 투표의 상태를 변경 해주는 것이었는데</p>
<p>회의를 하다가 문득 &quot;상태&quot; 컬럼이 왜 필요한가? 라는 주제가 나오게 됐다.</p>
<p>사실 로직에서도</p>
<p>시작 시간과 종료 시간만 컬럼에 저장해놓는다면,</p>
<p>상태 라는 개념은 필요가 없는 것이 아니냐 였는데</p>
<p>나는 있어야한다 를 주장하고 있었는데도 불구하고,</p>
<p>코드의 가독성을 제외하고는 사실 필요가 없나? 라고 의문이 들기 시작했다.</p>
<p>로직에서도 대기 / 진행 / 종료 라는 개념만 있으면 되는데</p>
<p>해당하는건 서버 현재시간이 시작시간전 / 시작시간과 종료시간 내 / 종료시간 후</p>
<p>면 그냥 해결이 되는것 아니냐는 문제 였다.</p>
<p>이런문제야 어느 관점으로 보냐의 차이겠지만,</p>
<p>내 입장에서는 상태 컬럼이 존재하는 것이 더 명확하고 추후 유지보수 시</p>
<p>새로운 개발자가 봤을때도 더 직관적이고 빠르게 이해 할 수 있지 않나?</p>
<p>라는 의견</p>
<p>반대의 의견은</p>
<p>개발자의 편의를 위해서 성능에 영향이 갈 수 있는데 </p>
<p>데이터베이스의 한 컬럼을 소비 하는 것이</p>
<p>괜찮은 것이냐? 라는 의견이었다.</p>
<p>내가봐도 상태 컬럼이 없다고 해서 문제가 생길만한 기능이 아니어서</p>
<p>어느정도 납득은 됐다.</p>
<p>그래서 결론은 </p>
<p>일단 이미 코딩이 어느정도 진행중이었기때문에</p>
<p>추후에 상태 컬럼을 없애는쪽으로 진행..</p>
<p>정답은 없는 거라지만,</p>
<p>참 애매모호 한 문제 인 것 같아 작성 하게 됐다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[stream 보다 For가 '속도는' 빠르다]]></title>
            <link>https://velog.io/@ksw_dev/stream-%EB%B3%B4%EB%8B%A4-For%EA%B0%80-%EC%86%8D%EB%8F%84%EB%8A%94-%EB%B9%A0%EB%A5%B4%EB%8B%A4</link>
            <guid>https://velog.io/@ksw_dev/stream-%EB%B3%B4%EB%8B%A4-For%EA%B0%80-%EC%86%8D%EB%8F%84%EB%8A%94-%EB%B9%A0%EB%A5%B4%EB%8B%A4</guid>
            <pubDate>Mon, 30 Oct 2023 01:13:00 GMT</pubDate>
            <description><![CDATA[<h3 id="2배-가까이-느린경우도-많다">2배 가까이 느린경우도 많다!</h3>
<h4 id="왜-stream이-느린가---jvm에서-하는-것이-많다">왜 Stream이 느린가 -&gt; jvm에서 하는 것이 많다.</h4>
<h4 id="왜-for가-빠른가---for는-단순-인덱싱이다-컴파일러가-최적화-시킨다">왜 for가 빠른가 -&gt; for는 단순 인덱싱이다, 컴파일러가 최적화 시킨다.</h4>
<h3 id="근데-왜-stream-씀">근데 왜 stream 씀?</h3>
<h4 id="읽기가-편하다-가독성이-좋다">읽기가 편하다! 가독성이 좋다!</h4>
<h4 id="스트림-내부-함수-이용하면-로직-작성을-덜해도-된다">스트림 내부 함수 이용하면 로직 작성을 덜해도 된다!</h4>
]]></description>
        </item>
        <item>
            <title><![CDATA[[오류해결] BadCredentialsException: 자격 증명에 실패하였습니다.]]></title>
            <link>https://velog.io/@ksw_dev/%EC%98%A4%EB%A5%98%ED%95%B4%EA%B2%B0-BadCredentialsException-%EC%9E%90%EA%B2%A9-%EC%A6%9D%EB%AA%85%EC%97%90-%EC%8B%A4%ED%8C%A8%ED%95%98%EC%98%80%EC%8A%B5%EB%8B%88%EB%8B%A4</link>
            <guid>https://velog.io/@ksw_dev/%EC%98%A4%EB%A5%98%ED%95%B4%EA%B2%B0-BadCredentialsException-%EC%9E%90%EA%B2%A9-%EC%A6%9D%EB%AA%85%EC%97%90-%EC%8B%A4%ED%8C%A8%ED%95%98%EC%98%80%EC%8A%B5%EB%8B%88%EB%8B%A4</guid>
            <pubDate>Tue, 17 Oct 2023 03:01:31 GMT</pubDate>
            <description><![CDATA[<p>포트폴리오 Jwt를 구현하다가 부딪힌 오류다.</p>
<pre><code>    // CustomUserDetailsServce에서 만든 loadUserByUserName이 실행된다.

    Authentication authentication = authenticationManagerBuilder.getObject().authenticate(authenticationToken);</code></pre><p>이 부분에서 오류가 났는데,</p>
<p>커스텀으로 만든 userDetail을 일단 보여주자면</p>
<pre><code>  @Override
  @Transactional
  // 로그인시에 DB에서 유저정보와 권한정보를 가져와서 해당 정보를 기반으로 userdetails.User 객체를 생성해 리턴
  public UserDetails loadUserByUsername(final String username) throws UsernameNotFoundException {

    return customerRepository.findOneWithAuthoritiesByCustomerEmail(username)
        .map(user -&gt; createUser(username, user))
        .orElseThrow(() -&gt; new UsernameNotFoundException(username + &quot; -&gt; 유저를 찾을 수 없습니다.&quot;));
  }

  private org.springframework.security.core.userdetails.User createUser(String username, Customer customer) {
    if (!customer.isActivated()) {
      throw new RuntimeException(username + &quot; -&gt; 활성화되어 있지 않습니다.&quot;);
    }

    List&lt;GrantedAuthority&gt; grantedAuthorities = customer.getAuthorities()
        .stream()
        .map(authority -&gt; new SimpleGrantedAuthority(authority.getAuthority()))
        .collect(Collectors.toList());

    return new User(customer.getCustomerName(), bCryptPasswordEncoder.encode(customer.getPassword()), grantedAuthorities);
  }
}</code></pre><p>loadUserByUsername 메소드를 사용하는데</p>
<p>새로운 유저를 만들어 security context에 넣어주는 과정에서</p>
<p>이미 저 customer 라는 객체를 파라미터로 받을때</p>
<p>내부의 password는 암호화가 되어있었는데</p>
<p>위 코드를 리턴할때 한번더 암호화를 해버렸고 그 결과</p>
<p>.authenticate()메소드를 구현하는 </p>
<p>AbstractUserDetailsAuthenticationProvider 라는 추상 클래스에서 </p>
<p>additionalAuthenticationChecks() 라는 메소드 안에서 오류가 발생했다.</p>
<pre><code>        if (!this.passwordEncoder.matches(presentedPassword, userDetails.getPassword())) {
            this.logger.debug(&quot;Failed to authenticate since password does not match stored value&quot;);
            throw new BadCredentialsException(this.messages
                    .getMessage(&quot;AbstractUserDetailsAuthenticationProvider.badCredentials&quot;, &quot;Bad credentials&quot;));
        }
    }</code></pre><p>BcyptEncoder를 통해</p>
<p>userDetail 과  UsernamePasswordAuthenticationToken 의</p>
<p>비밀번호가 매치 하는지 확인하는 와중에 에러가 발생한 것 같다.</p>
<p>해서 </p>
<pre><code>  private org.springframework.security.core.userdetails.User createUser(String username, Customer customer) {
    if (!customer.isActivated()) {
      throw new RuntimeException(username + &quot; -&gt; 활성화되어 있지 않습니다.&quot;);
    }

    List&lt;GrantedAuthority&gt; grantedAuthorities = customer.getAuthorities()
        .stream()
        .map(authority -&gt; new SimpleGrantedAuthority(authority.getAuthority()))
        .collect(Collectors.toList());

    return new User(customer.getCustomerEmail(), customer.getPassword(), grantedAuthorities);
  }</code></pre><p>로 변경해 오류를 해결했다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[포트폴리오 레이어드 아키텍쳐]]></title>
            <link>https://velog.io/@ksw_dev/%ED%8F%AC%ED%8A%B8%ED%8F%B4%EB%A6%AC%EC%98%A4-%EB%A0%88%EC%9D%B4%EC%96%B4%EB%93%9C-%EC%95%84%ED%82%A4%ED%85%8D%EC%B3%90</link>
            <guid>https://velog.io/@ksw_dev/%ED%8F%AC%ED%8A%B8%ED%8F%B4%EB%A6%AC%EC%98%A4-%EB%A0%88%EC%9D%B4%EC%96%B4%EB%93%9C-%EC%95%84%ED%82%A4%ED%85%8D%EC%B3%90</guid>
            <pubDate>Wed, 04 Oct 2023 00:32:10 GMT</pubDate>
            <description><![CDATA[<p>포트폴리오로 백엔드를 만드는데,</p>
<p>정확히 어떻게 왜 언제 쓰는지 모르는 아키텍쳐를</p>
<p>있어보이려고 갖다붙이기 보다 기본 토대를 탄탄히 해보자는 느낌에서</p>
<p>기본적인 mvc2 방식에서 DDD구조에서 쓰이는 파사드 구조만 조금 떼낸뒤</p>
<p>hexagonal 아키텍쳐에 사용되는 application 단을 사용 해봤다</p>
<p>기본적인 구조는 이렇게 되어있다</p>
<p><img src="https://velog.velcdn.com/images/ksw_dev/post/cac6a20d-242f-422c-9710-6dcdaedd41cf/image.png" alt=""></p>
<h3 id="domain">domain</h3>
<p>최상위 계층으로 도메인 이름으로 패키지를 구성한다</p>
<h3 id="controller">controller</h3>
<p>도메인 안의 컨트롤러 패키지로 restController를 모아두고,</p>
<p>request Dto 폴더를 내부에 생성에 dto 관리를 한다.</p>
<h3 id="facade">facade</h3>
<p>파사드 패턴으로, 파사드 패키지 안에서만 
현재 도메인 외 외부 도메인, 서비스와 교류 해 코드 복잡성을 줄인다.</p>
<h3 id="application">application</h3>
<p>application/inport 는 service interface를 만들어 보관한다.</p>
<p>application/outport 는 외부 레포지토리 인터페이스를 보관한다.</p>
<p>application/service/serviceImpl에 해당 도메인 관련된
비즈니스 로직을 구현한다.</p>
<h3 id="external">external</h3>
<p>외부에서 오는 데이터등을 관리한다.
repository(db) 포함.</p>
<h3 id="왜">왜?</h3>
<p>&#39;추후의 확장성만 고려&#39; 한다면 더 용이한 아키텍처가
많겠지만 일단의 목표는 완성과 배포가 우선이기때문에
비교적 단순한 구조를 채택했다.</p>
<p>facade로 여러서비스가 한곳에 엉켜 가독성이 안좋아지는
부분을 막으려고 facade패키지를 따로 추가함.</p>
<p>(2023-10-18 수정)
application단 추가는 reader,store를 들여 오면서
application을 단순히 service라고 표현하기에는 무리가 있다 싶어
변경했다.</p>
<p>service에 &#39;접근&#39;하기때문에 inport(밖에서 안으로 들어온다)
service에서 &#39;호출&#39;하기때문에 outport(안에서 외부인자를 호출)</p>
<p>repository를 reader 와 store로 나누고,
reader는 셀렉트 관련 쿼리,
store는 그외의 쿼리들을 구분하면 서비스에서는 네이밍을 
깔끔하게 쓸수 있다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[hexagonal 구조 관련 ]]></title>
            <link>https://velog.io/@ksw_dev/%ED%8C%A8%ED%82%A4%EC%A7%80-%EB%94%94%EC%9E%90%EC%9D%B8-%ED%8C%A8%ED%84%B4%EC%97%90-%EB%8C%80%ED%95%9C-%EC%83%9D%EA%B0%812</link>
            <guid>https://velog.io/@ksw_dev/%ED%8C%A8%ED%82%A4%EC%A7%80-%EB%94%94%EC%9E%90%EC%9D%B8-%ED%8C%A8%ED%84%B4%EC%97%90-%EB%8C%80%ED%95%9C-%EC%83%9D%EA%B0%812</guid>
            <pubDate>Thu, 25 May 2023 04:10:18 GMT</pubDate>
            <description><![CDATA[<p>이전에 hexagonal 패키지 디자인 패턴에 대해서 아직은 잘 모르겠다던 글이 생각나서 다시 작성한다.</p>
<p>지금은 그때보다는 조금 더 이해 하게 된 편이다.</p>
<p>사용했을때의 장점은 현재의 내가 이해 하기로서는 의존성을 많은 부분 덜어낼 수 있고, </p>
<p>에러가 발생했을때 비교적 빠르게 찾아낼 수 있으며 유지보수성에 큰 도움을 준다 정도 인 것 같다.</p>
<p>// 여기부터는 현재까지 내가 이해한 내용들을 정리 한 것이다.
// 틀린 부분이 있을 수 있으니 혹시나 보시는 분이 있다면 한번 더 찾아보시는 걸 추천..</p>
<p>처음에는 마냥 복잡해 보였는데 직장 동료분의 설명을 듣고 확 와닿았던 것은</p>
<p>adapter 단 과</p>
<p>application 단</p>
<p>domain 단 으로</p>
<p>큰 3가지 단이 있고, 여기에 in,out등이 생기는 구조 인데 </p>
<p>이런식으로 보면 가장 편하다.</p>
<p><img src="https://velog.velcdn.com/images/ksw_dev/post/acfcdeab-34e7-488b-a040-497b83b7b9ad/image.png" alt=""></p>
<p>원래 좀 더 단순한 그림 이었는데 <br/>애매한 부분이 있어 동료들에게 물어보다보니 더 복잡해졌다...
<br/></p>
<p>보통은 이름이 hexagonal 이라 육각형으로 그리는 경우가 대부분이다.<br/>
나같은 경우에는 육각형으로 보면 감을 잡지 못했었는데,<br/>이런식으로 보니 그나마 이해가 갔다.</p>
<p>저 그림에서 포트 인 과 아웃이 위아래로 늘어나면 육각형이 되는 형태 인 것.
<br/>
내가 &#39;이해하고 사용하는 이유&#39;는 현재로서는 의존성 자체를
꽤많이 줄일수 있는 구조 라는것 정도다.</p>
<pre><code>apdapter in 은 portIn 을 의존하고, portIn은 서비스 기능을 구현한다.

그래서 서비스는 보통 인터페이스로 구성 하고

그래서 어댑터나 포트인 쪽에서 데이터가 꼬이거나 오류가 발생해도 

포트아웃쪽으로는 사이드 이펙트가 전파가 되지않는다.

반대로 

포트아웃이나 어댑터 아웃에서 필드명이 바뀐다거나 

메소드 변경이 생기는 일 이 발생 하더라도,

포트인쪽 까지는 사이드 이펙트가 전파 되지 않는 구조를 지닌다.</code></pre><p>지금 일하고 있는 회사에서는 <br/>좀 더 DDD 아키텍쳐랑 이것저것 섞어서 보완 해서 쓰긴 했지만</p>
<p>사실 이걸 온전히 내가 이해 하고 쓰고 있냐고 한다면 아직은 부족한 것 같다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[타입 스크립트 에서 어처구니 X한 실수]]></title>
            <link>https://velog.io/@ksw_dev/%ED%83%80%EC%9E%85-%EC%8A%A4%ED%81%AC%EB%A6%BD%ED%8A%B8-%EC%97%90%EC%84%9C-%EC%96%B4%EC%B2%98%EA%B5%AC%EB%8B%88-X%ED%95%9C-%EC%8B%A4%EC%88%98</link>
            <guid>https://velog.io/@ksw_dev/%ED%83%80%EC%9E%85-%EC%8A%A4%ED%81%AC%EB%A6%BD%ED%8A%B8-%EC%97%90%EC%84%9C-%EC%96%B4%EC%B2%98%EA%B5%AC%EB%8B%88-X%ED%95%9C-%EC%8B%A4%EC%88%98</guid>
            <pubDate>Tue, 04 Apr 2023 02:02:36 GMT</pubDate>
            <description><![CDATA[<p><strong>vue3 compositionAPI를 사용하다가 한참 해멘 실수</strong> 인데</p>
<p>회사에서 베이스로 사용하는 모달 페이지가 있어서 사용하려 했는데</p>
<p>다른 페이지에서 사용 된건 이미 잘 되고 있고,</p>
<p>내가 개발 하려는 페이지서만 모달창이 뜨지 않았다.</p>
<p>웃긴건 </p>
<blockquote>
<p>개발하는 페이지 (안됨) -&gt; 
다른 아무페이지로 이동 -&gt; 
개발하는 페이지 로 가면
모달이 작동을 한다..</p>
</blockquote>
<p>라우터 문제인가 렌더링이 안된건가 아니면 너무 된건가 찾아보던 와중에</p>
<blockquote>
<p>결론만 말하자면 부트스트랩이 import가 안되어 있었다 ㅎㅎ..</p>
</blockquote>
<p>다른페이지에 갔다 오면 왜 어떤방식으로 작동되는건지는 알아내지 못했다..</p>
<p>그래서 기존 모달 페이지 내부에 부트스트랩을 import 해주니 전역으로 잘 돌아갔다 ^&lt;^;</p>
<blockquote>
<p><code>import &#39;bootstrap/js/dist/modal&#39;;</code></p>
</blockquote>
]]></description>
        </item>
        <item>
            <title><![CDATA[패키지 디자인 패턴에 대한 생각]]></title>
            <link>https://velog.io/@ksw_dev/%ED%8C%A8%ED%82%A4%EC%A7%80-%EC%95%84%ED%82%A4%ED%85%8D%EC%B3%90%EC%97%90-%EB%8C%80%ED%95%9C-%EC%83%9D%EA%B0%81</link>
            <guid>https://velog.io/@ksw_dev/%ED%8C%A8%ED%82%A4%EC%A7%80-%EC%95%84%ED%82%A4%ED%85%8D%EC%B3%90%EC%97%90-%EB%8C%80%ED%95%9C-%EC%83%9D%EA%B0%81</guid>
            <pubDate>Wed, 01 Feb 2023 07:29:07 GMT</pubDate>
            <description><![CDATA[<p>솔직히 아직은 잘 모르겠다.</p>
<p>아무래도 경험 자체가 좀 적고 실제로 아키텍쳐의 덕을 보거나 &quot;유용했다!&quot; 라는 느낌을 </p>
<p>받지 못해서 인것 같다.</p>
<p>요 근래 하고 있는 사이드프로젝트에서 DDD+layout 구조를 쓰고</p>
<p>현재 다니는 회사에서 개발하고 있는 새 프로젝트는 hexagonal 아키텍쳐를 쓰기로 정하고</p>
<p>개발을 하고 있는데 과정이 길어질 뿐더러 request 변수가 하나 바뀌면 </p>
<p>이후 command , info 등을 수정하고 </p>
<p>관련 비즈니스 로직 도 체크를 해야하니 그저 번거롭고 복잡하다. 정도의 생각인 것 같다.</p>
<p>그나마 이해가 됐던건 의존성을 최대한 줄일 수 있다 정도,,, 그래도 아직 실제로 오픈을 해보고</p>
<p>많은 테스트가 이루어 진게 아닌 초반 설계 단계이다보니 장점을 못본 것 같다.</p>
<p>에러잡을때도 훨씬 편하다고 하니 눈에 안익어도 억지로 봐야겠다는 생각.</p>
<p>배워야할 게 산더미다 아오..</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[롬복 어노테이션]]></title>
            <link>https://velog.io/@ksw_dev/%EB%A1%AC%EB%B3%B5-%EC%96%B4%EB%85%B8%ED%85%8C%EC%9D%B4%EC%85%98</link>
            <guid>https://velog.io/@ksw_dev/%EB%A1%AC%EB%B3%B5-%EC%96%B4%EB%85%B8%ED%85%8C%EC%9D%B4%EC%85%98</guid>
            <pubDate>Wed, 01 Feb 2023 07:13:36 GMT</pubDate>
            <description><![CDATA[<p>NoArgsConstructor
    빈 생성자 만드는 어노테이션</p>
<p>AllArgsConstructor
    필드값 다 가진 생성자 만드는 어노테이션</p>
<p>Builder
    필요한 필드 값만 따로 가져올수 있게 만드는 어노테이션
    순서 안지켜도 됨
    직접 만들면 생성자 만든 순서 대로 해야됨
    ex) Member.builder().username<del>~</del>.build();</p>
<p>Data 
    게터 세터 다만들어주는 어노테이션
    외에도 여러가지를 만들어주는데 @Data 자체를 추천하지 않는 경우도 있다.
    코틀린의 경우는 dataClass 라는게 있어서 자체지원 됨</p>
<p>Getter
    게터만 만들어줌
Setter
    세터만 만들어줌</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[자바 변수를 private 으로 만드는 이유]]></title>
            <link>https://velog.io/@ksw_dev/%EC%9E%90%EB%B0%94-%EB%B3%80%EC%88%98%EB%A5%BC-private-%EC%9C%BC%EB%A1%9C-%EB%A7%8C%EB%93%9C%EB%8A%94-%EC%9D%B4%EC%9C%A0</link>
            <guid>https://velog.io/@ksw_dev/%EC%9E%90%EB%B0%94-%EB%B3%80%EC%88%98%EB%A5%BC-private-%EC%9C%BC%EB%A1%9C-%EB%A7%8C%EB%93%9C%EB%8A%94-%EC%9D%B4%EC%9C%A0</guid>
            <pubDate>Wed, 01 Feb 2023 07:11:50 GMT</pubDate>
            <description><![CDATA[<pre><code>직접 변수를 변경하는걸 막기위해서.
변수를 &quot;메서드에 의해 변경이 되도록 만들어야 객체지향임&quot;</code></pre>]]></description>
        </item>
        <item>
            <title><![CDATA[http 웹 통신 방식]]></title>
            <link>https://velog.io/@ksw_dev/http-%EC%9B%B9-%ED%86%B5%EC%8B%A0-%EB%B0%A9%EC%8B%9D</link>
            <guid>https://velog.io/@ksw_dev/http-%EC%9B%B9-%ED%86%B5%EC%8B%A0-%EB%B0%A9%EC%8B%9D</guid>
            <pubDate>Fri, 27 Jan 2023 02:00:10 GMT</pubDate>
            <description><![CDATA[<p>HTTP 통신을 쓸대 우리가 쓰느 ㄴ방식은</p>
<blockquote>
<p>패킷 스위칭 </p>
</blockquote>
<p>데이터를 하나하나 쪼개고 
그것을 패킷이라고 함
그걸 한개씩 전송함</p>
<p>패킷스위칭 을쓰면 C라는 사용자가 
데이터를 보내도 같은 선을 이용함
<br>
                받는 서버 쪽에서 각각 사용자의 데이터를 조립함
                데이터는 전선을 이용해 들어오는데
                <br>
패킷 경우엔 3개의 데이터를 보내면 각자가
                다른 속도로 누가먼저 도착할지 몰라서
                모든 패킷에는 헤더가 붙어있음
                <br>
헤더에 순서, 보낸 사람이 누군지 식별자가 
                붙어있어서 정리가능
                <br>
바디에는 실질적 데이터가 들어가는것
                바디 데이터의 타입은
                TEXT일수도, 이미지 일수도 AVI일수도있기때문에
                MIME타입을 공부해야 설정을 해서 보낼수 있음
            <br></p>
<blockquote>
<p>서킷 스위칭</p>
</blockquote>
<p>A와 B가 데이터를 교환할때
데이터를 한방에 올려서 전송함</p>
<p>속도는 빠르지만 선이 물리적으로 많이 필요함</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[MIME(마임) 타입]]></title>
            <link>https://velog.io/@ksw_dev/MIME%EB%A7%88%EC%9E%84-%ED%83%80%EC%9E%85</link>
            <guid>https://velog.io/@ksw_dev/MIME%EB%A7%88%EC%9E%84-%ED%83%80%EC%9E%85</guid>
            <pubDate>Fri, 27 Jan 2023 01:57:13 GMT</pubDate>
            <description><![CDATA[<blockquote>
<p>MIME(마임) 타입
패킷으로 데이터를 보낼때 바디에 들어갈 데이터의 타입 형식이란 뜻
POST요청은 여기에 대한 ~~ 데이터를 추가! 해줘 라는 뜻인데
이걸 어디에 담냐면 요청시에 헤더와 바디 라는 걸 달고 요청을 감</p>
</blockquote>
<p>내 사진이 MY.JPEG 라고 치면</p>
<p>헤더에 : IMAGE/JPEG</p>
<p>바디에 : MY.JPEG 가 들어감</p>
<p>바디에는 실질적 데이터</p>
<p>헤더에는 데이터를 설명해주는 내용이 있어야함</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[stateless 와 statefull]]></title>
            <link>https://velog.io/@ksw_dev/stateless-%EC%99%80-statefull</link>
            <guid>https://velog.io/@ksw_dev/stateless-%EC%99%80-statefull</guid>
            <pubDate>Fri, 27 Jan 2023 01:55:56 GMT</pubDate>
            <description><![CDATA[<blockquote>
<p>Stateless 
요청시 마다 스트림을 연결해서 데이터를 주고받는 방식
http 가 이 방식을 씀</p>
</blockquote>
<blockquote>
<p>Statefull 
연결이 지속되있는 방식 
(채팅같이 데이터 실시간 연결)</p>
</blockquote>
<blockquote>
<p>세션을 만들다 = 데이터를 응답해줄 준비가됨 (인증이 됨)</p>
</blockquote>
<p>http는 stateless라서 연결이 끊기면 세션을 끊어야되서</p>
<p>이걸 어떻게 유지할 것인가가 중요</p>
<p>2022 / 05 / 10 -&gt; 아직 제대로 된 이해 못 함</p>
<p>2023 / 01 / 27 -&gt; 놀랍게도 지금도 다를바 없는듯 흐릿한 개념만 남아있다 공부 할 것...</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[http 1.1 ]]></title>
            <link>https://velog.io/@ksw_dev/http-1.1</link>
            <guid>https://velog.io/@ksw_dev/http-1.1</guid>
            <pubDate>Fri, 27 Jan 2023 01:53:17 GMT</pubDate>
            <description><![CDATA[<p>http 통신 은 약속(프로토콜)이다</p>
<p>클라이언트 = 배고픈 사람 = 요청하는 사람</p>
<p>통신방법 (요청,request) 4가지</p>
<blockquote>
<p>get = 데이터를 줘! (Select)</p>
<blockquote>
<p>get 방식으로만 인터넷 브라우저를 불러올수 있고
어떤 데이터를 요청할 건지 요청하는 방법은 쿼리스트링 밖에없다
특징 : body로 데이터를 담아 보내지 않음 
주소(헤더)에 데이터를 담아서 보내는것
<u>그래서 무슨데이터를 보내는지 다 보임</u></p>
</blockquote>
</blockquote>
<p>나머지 3개는 데이터를 변경하는 요청임
    - 데이터를 담아보내야 할 것이 많다.
    - 회원가입만 해도 주르륵 있음</p>
<blockquote>
<p>post =  데이터를 추가해 줘! (Insert)<br>        클라이언트가 데이터를 입력(예를 들면 회원가입처럼)해서 던져줌!</p>
</blockquote>
<blockquote>
<p>put = 데이터를 수정해 줘! (update) -&gt; DB row 전체를 갈아 치우는 것이 때문에 
필요한 경우에만 쓰는 것이 베스트~</p>
</blockquote>
<blockquote>
<p>patch = 데이터를 &quot;일부만&quot; 수정해줘! (update) -&gt; 
DB row 한줄을 전부 바꾸는 것이 아닌 경우에 쓰면 효율적</p>
</blockquote>
<blockquote>
<p>delete = 데이터를 지워 줘! (delete)</p>
</blockquote>
]]></description>
        </item>
        <item>
            <title><![CDATA[JPA / Update / dirty checking]]></title>
            <link>https://velog.io/@ksw_dev/JPA-Update-dirty-checking</link>
            <guid>https://velog.io/@ksw_dev/JPA-Update-dirty-checking</guid>
            <pubDate>Fri, 27 Jan 2023 01:48:19 GMT</pubDate>
            <description><![CDATA[<p>@Transactional 어노테이션을 걸고
영속성 컨텍스트에 저장 될 자료를 넣어두면
.save 를 하지 않아도 트랜잭션이 종료 되기 직전 
영속성 컨텍스트와 실제 DB의 차이를 스프링에서 인식하고 
업데이트가 된다</p>
<p>이걸 더티체킹이라고 함</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[스프링 컨테이너 (IOC)]]></title>
            <link>https://velog.io/@ksw_dev/%EC%8A%A4%ED%94%84%EB%A7%81-%EC%BB%A8%ED%85%8C%EC%9D%B4%EB%84%88-IOC</link>
            <guid>https://velog.io/@ksw_dev/%EC%8A%A4%ED%94%84%EB%A7%81-%EC%BB%A8%ED%85%8C%EC%9D%B4%EB%84%88-IOC</guid>
            <pubDate>Fri, 27 Jan 2023 01:46:12 GMT</pubDate>
            <description><![CDATA[<p>쉽게말해 제어의 역전,</p>
<ul>
<li>스프링이 heap영역을 제어함
  그래서 내가 스택안의 지역변수들을<br>  매번 만들 필요없이 어노테이션을 붙여서
  스프링컨테이너에 인식을 시키면
  알아서 스프링이 만들어준다.</li>
</ul>
<p>IOC를 따르기 위해서
패키지 파일을 ioc 규칙에 맞게 설계해야함</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[마이바티스 TooManyResultsException 에러 해결]]></title>
            <link>https://velog.io/@ksw_dev/%EB%A7%88%EC%9D%B4%EB%B0%94%ED%8B%B0%EC%8A%A4-TooManyResultsException-%EC%97%90%EB%9F%AC-%ED%95%B4%EA%B2%B0</link>
            <guid>https://velog.io/@ksw_dev/%EB%A7%88%EC%9D%B4%EB%B0%94%ED%8B%B0%EC%8A%A4-TooManyResultsException-%EC%97%90%EB%9F%AC-%ED%95%B4%EA%B2%B0</guid>
            <pubDate>Thu, 10 Nov 2022 00:14:38 GMT</pubDate>
            <description><![CDATA[<p>뭔가 했다.</p>
<p>처음에 resultType이나 ParameterType 문제 인 줄 알고 허둥거렸으나</p>
<p>if문으로 걸어놓은 권한에 의한 Join 조건이 문제 였다.</p>
<pre><code>  &lt;if test=&quot;group != null and !gruop.equals(&#39;manager&#39;) and !gruop.equals(&#39;secondManager&#39;)&quot;&gt;
          LEFT OUTER JOIN OtherTable
  ON customerName = OtherTable.customerName
  &lt;/if&gt;</code></pre><p>이런 비슷한 조건이 붙어 있어서 (아마 만들때 잘 못 들어간 것으로 추정)</p>
<p>내가 쿼리를 보는 상황에서는 if문이 false로 나와서 join 자체가 들어가지 않았고</p>
<p>다른 직원들이 보려하면 true였기때문에 join이 들어가고</p>
<p>하나의 결과만 나와야 하는 쿼리에서 조인으로 여러항목이 불러져와서 만들어진 오류 였다.</p>
]]></description>
        </item>
    </channel>
</rss>