<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <title>duhyeon-afk.log</title>
        <link>https://velog.io/</link>
        <description>기억코딩 - 코딩을 대신 기억해드림</description>
        <lastBuildDate>Mon, 08 Jan 2024 04:52:56 GMT</lastBuildDate>
        <docs>https://validator.w3.org/feed/docs/rss2.html</docs>
        <generator>https://github.com/jpmonette/feed</generator>
        <image>
            <title>duhyeon-afk.log</title>
            <url>https://velog.velcdn.com/images/dcis___/profile/0faae194-0e5b-41e5-9c1c-ff04c54a2d86/social_profile.png</url>
            <link>https://velog.io/</link>
        </image>
        <copyright>Copyright (C) 2019. duhyeon-afk.log. All rights reserved.</copyright>
        <atom:link href="https://v2.velog.io/rss/dcis___" rel="self" type="application/rss+xml"/>
        <item>
            <title><![CDATA[Spring - PostgreSQL Listen & Notify]]></title>
            <link>https://velog.io/@dcis___/Spring-PostgreSQL-Listen-Notify</link>
            <guid>https://velog.io/@dcis___/Spring-PostgreSQL-Listen-Notify</guid>
            <pubDate>Mon, 08 Jan 2024 04:52:56 GMT</pubDate>
            <description><![CDATA[<p><img src="https://velog.velcdn.com/images/dcis___/post/a783b2f5-02c3-4faf-a996-d52c3d8ed40c/image.png" alt=""></p>
<hr>
<h3 id="postgresql의-비동기-작업">PostgreSQL의 비동기 작업</h3>
<blockquote>
<p>spring에서 실시간 알람 기능을 구현하던 도중 DB에 새로운 값이 들어오는걸 실시간으로 감지를 해야했다.
찾던 도중 PostgreSQL의 Trigger를 기반으로 한 Listen &amp; Notify라는게 있다는걸 알았다.</p>
</blockquote>
<h1 id="1-postgresql-listen--notify">1. PostgreSQL Listen &amp; Notify</h1>
<ul>
<li>PostgreSQL Listen &amp; Notify란 Trigger를 기반으로 한 비동기 작업</li>
<li>DB의 테이블 row가 변경될때마다 공지하는 <strong>Notify</strong></li>
<li>공지하는 내용을 듣는 채널인 <strong>Listen</strong></li>
</ul>
<h1 id="2-notify-설정">2. Notify 설정</h1>
<pre><code>CREATE OR REPLACE FUNCTION public.notify_alarm()
 RETURNS trigger
 LANGUAGE plpgsql
AS $function$
begin
    RAISE NOTICE &#39;%&#39;, NEW.alm_info;    
  PERFORM pg_notify(&#39;alarm_watcher&#39;, 
                  NEW.alm_pk || &#39;,&#39; || NEW.alm_info);
  RETURN NEW;
END;
$function$</code></pre><ul>
<li>pg_notify로 공지 내용을 설정하고 &#39;alarm_watcher&#39; 라는 채널 생성</li>
<li>알람PK와 알람 내용을 공지 </li>
</ul>
<h1 id="3-트리거-등록">3. 트리거 등록</h1>
<pre><code>CREATE TRIGGER 
    ALARM_TRIGGER
AFTER INSERT 
    ON ALARM_TABLE
FOR EACH ROW
EXECUTE FUNCTION NOTIFY_ALARM()</code></pre><ul>
<li>ALARM_TABLE에 Trigger 생성</li>
</ul>
<h1 id="4-listen-채널-감지">4. Listen 채널 감지</h1>
<pre><code>import org.postgresql.PGConnection;
import org.postgresql.PGNotification;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.jdbc.core.JdbcTemplate;

import javax.annotation.PostConstruct;
import javax.annotation.PreDestroy;
import javax.annotation.Resource;
import java.sql.Connection;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.TimeUnit;

public class PostgreSQLNotificationListener {

    private final Logger LOGGER = LoggerFactory.getLogger(this.getClass());
    private static final String LISTEN_CHANNEL = &quot;alarm_watcher&quot;;
    private static final int SLEEP_INTERVAL = 100;

    private JdbcTemplate jdbcTemplate;

    private ExecutorService executorService;
    private volatile boolean isRunning = true;
    private Connection connection;

    public void setJdbcTemplate(JdbcTemplate jdbcTemplate) {
        this.jdbcTemplate = jdbcTemplate;
    }

    @PostConstruct
    public void initialize() {
        listenForNotifications();
    }

    public void listenForNotifications() {
        try (Connection connection = jdbcTemplate.getDataSource().getConnection();
             Statement stmt = connection.createStatement()) {
            PGConnection pgConnection = connection.unwrap(PGConnection.class);
            stmt.execute(&quot;LISTEN &quot; + LISTEN_CHANNEL);

            executorService = Executors.newSingleThreadExecutor();
            executorService.submit(() -&gt; {
                try {
                    while (isRunning) {
                        PGNotification[] notifications = pgConnection.getNotifications();
                        if (notifications != null) {
                            for (PGNotification notification : notifications) {
                                handleNotification(notification);
                            }
                        }
                        Thread.sleep(SLEEP_INTERVAL);
                    }
                } catch (SQLException | InterruptedException e) {
                    LOGGER.error(&quot;Error in notification listener&quot;, e);
                    Thread.currentThread().interrupt();
                }
            });
        } catch (SQLException e) {
            LOGGER.error(&quot;Error setting up database connection&quot;, e);
        }
    }

    private void handleNotification(PGNotification notification) {

            LOGGER.info(&quot;Notification received: {}&quot;, notification.getParameter());

    }

    @PreDestroy
    public void destroy() {
        isRunning = false;

        if (executorService != null) {
            executorService.shutdown();
            try {
                if (!executorService.awaitTermination(10, TimeUnit.SECONDS)) {
                    LOGGER.warn(&quot;Executor service did not terminate gracefully&quot;);
                }
            } catch (InterruptedException e) {
                LOGGER.error(&quot;Error during executor service termination&quot;, e);
                Thread.currentThread().interrupt();
            }
        }

        try {
            if (connection != null &amp;&amp; !connection.isClosed()) {
                connection.close();
            }
        } catch (SQLException e) {
            LOGGER.error(&quot;Error closing database connection&quot;, e);
        }
    }
}</code></pre><ul>
<li>Java Spring의 SingleThread를 이용해 Listen채널 감지</li>
<li>Listen &quot;채널이름&quot; 으로 채널 감지</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[AWS - EC2 (1)]]></title>
            <link>https://velog.io/@dcis___/AWS-EC2-1</link>
            <guid>https://velog.io/@dcis___/AWS-EC2-1</guid>
            <pubDate>Tue, 24 Oct 2023 11:40:39 GMT</pubDate>
            <description><![CDATA[<p><img src="https://velog.velcdn.com/images/dcis___/post/cd1f6040-aebe-498b-a95a-abafbcba3db1/image.png" alt=""></p>
<h1 id="ec2elastic-compute-cloud란">EC2(Elastic Compute Cloud)란?</h1>
<ul>
<li>클라우드 공간에서 크기가 유연하게 변경되는 기능을 제공</li>
<li>데이터가 들어오고 나오는걸 유연하게 대응할 수 있음</li>
<li>Elastic 이라는 단어 뜻처럼 사용한 만큼 요금을 지불하기고, 용량도 자율적으로 조절할 수 있기에 탄력적임</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[AWS - IAM이란?]]></title>
            <link>https://velog.io/@dcis___/AWS-IAM%EC%9D%B4%EB%9E%80</link>
            <guid>https://velog.io/@dcis___/AWS-IAM%EC%9D%B4%EB%9E%80</guid>
            <pubDate>Sun, 15 Oct 2023 15:45:04 GMT</pubDate>
            <description><![CDATA[<p><img src="https://velog.velcdn.com/images/dcis___/post/35147ce9-a3f6-4674-b27e-4b54e4873892/image.png" alt=""></p>
<h1 id="aws---iam">AWS - IAM</h1>
<h3 id="identity-and-management의-약자">(Identity And Management의 약자)</h3>
<hr>
<h4 id="1-유저를-관리한다">1. 유저를 관리한다</h4>
<ul>
<li>AWS회원가입 이후 유저를 생성할 때 관리하는 기능</li>
<li>접근레벨, 권한 관리</li>
<li>각 유저에 대한 접근 키(Access Key), 비밀 키(Seceret Access Key) 부여</li>
</ul>
<h4 id="2-세밀한-접근-권한-부여-가능">2. 세밀한 접근 권한 부여 가능</h4>
<ul>
<li>유저마다 각 기능별로의 접근 권한을 부여할 수 있음</li>
</ul>
<h4 id="3-비밀번호-변경-및-다중인증multi-factor-authentication-가능">3. 비밀번호 변경 및 다중인증(Multi Factor Authentication) 가능</h4>
<ul>
<li>사용자의 다양한 인증을 가능케 해줌</li>
</ul>
<h4 id="4-새로운-유저-생성할-수-있음">4. 새로운 유저 생성할 수 있음</h4>
]]></description>
        </item>
        <item>
            <title><![CDATA[백준 영수증(25304번) - 자바]]></title>
            <link>https://velog.io/@dcis___/%EB%B0%B1%EC%A4%80-%EC%98%81%EC%88%98%EC%A6%9D25304%EB%B2%88-%EC%9E%90%EB%B0%94</link>
            <guid>https://velog.io/@dcis___/%EB%B0%B1%EC%A4%80-%EC%98%81%EC%88%98%EC%A6%9D25304%EB%B2%88-%EC%9E%90%EB%B0%94</guid>
            <pubDate>Tue, 25 Jul 2023 16:14:59 GMT</pubDate>
            <description><![CDATA[<blockquote>
<h1 id="영수증25304">영수증(25304)</h1>
</blockquote>
<h2 id=""><img src="https://velog.velcdn.com/images/dcis___/post/a14f0cb5-d473-4395-ae45-4eed8f6c87c9/image.png" alt=""></h2>
<p><img src="https://velog.velcdn.com/images/dcis___/post/46cf39c7-da45-4e38-a6b8-337739b34bf4/image.png" alt=""></p>
<hr>
<h2 id="문제-의도">문제 의도</h2>
<h4 id="입력받은-값만큼-for문을-돌려-다시-for문-내에서-곱하기-연산-후-값-비교">입력받은 값만큼 for문을 돌려 다시 for문 내에서 곱하기 연산 후 값 비교</h4>
<pre><code>import java.util.*;

public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int A, B;
        A = sc.nextInt();
        B = sc.nextInt();
        int total = 0;
        for(int i = 0; i &lt; B; i++){
            int C, D;
            C = sc.nextInt();
            D = sc.nextInt();
            total += C*D;
        }
        if(A==total){
            System.out.println(&quot;Yes&quot;);
        }else{
            System.out.println(&quot;No&quot;);
        }
    }
}</code></pre><p>A : 총 금액
B : 영수증 물건의 종류 수
C : 각 물건의 가격
D : 각 물건의 수
total : 계산된 총 금액</p>
<hr>
<h2 id="총평">총평</h2>
<p>이정도는 검색 하지 않고 풀어야 하는 수준</p>
<p>출처 : <a href="https://www.acmicpc.net/problem/25304">영수증(25304번)</a></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[Spring Legacy Security 설정법-3]]></title>
            <link>https://velog.io/@dcis___/Spring-Legacy-Security-%EC%84%A4%EC%A0%95%EB%B2%95-3</link>
            <guid>https://velog.io/@dcis___/Spring-Legacy-Security-%EC%84%A4%EC%A0%95%EB%B2%95-3</guid>
            <pubDate>Thu, 16 Mar 2023 00:57:02 GMT</pubDate>
            <description><![CDATA[<h1 id="security-config">Security Config</h1>
<h3 id="security-config란">Security Config란?</h3>
<p>사실상 Security Config에서 Spring Security에 대한 설정은 거의 다 한다고 봐도 무방합니다.
WebSecurityConfigurerAdapter를 상속받아 사용하는 클래스 입니다.
여기서 Security FilterChain이 등록되기도 합니다.
보안 정책, 로그인, 권한 등등 많은 일을 Security에서 합니다.(보안 정책에 관한건 더 자세히 다루겠음)
여기선 로그인, 권한 설정 등만 다룰 것 입니다.
<em>(참고로 본인의 미니 프로젝트를 진행 하면서 소스코드를 기록하는거라 코드가 매우 본인 주관적임)</em></p>
<pre><code>@Configuration
@EnableWebSecurity(debug = true)
public class SecurityConfig extends WebSecurityConfigurerAdapter {
    ...
}</code></pre><ul>
<li>@Configuration : 스프링 설정 클래스임을 나타내는 어노테이션</li>
<li>@EnableWebSecurity(debug = true) : WebSecurityConfigurerAdapter를 상속받아 웹 보안을 활성화 하겠다는 어노테이션</li>
</ul>
<hr>
<h3 id="httpsecurity-http">HttpSecurity http</h3>
<p>Spring Security에서 보안, 권한 등을 설정하는 메소드 입니다.
지금은 권한만 다룰 예정입니다.</p>
<pre><code>    @Override
    protected void configure(HttpSecurity http) throws Exception {
        // TODO Auto-generated method stub
        http.csrf().disable();

        http.authorizeRequests()
                .antMatchers(&quot;/login&quot;).permitAll()
                .antMatchers(&quot;/signup&quot;).permitAll()
                .antMatchers(&quot;/join&quot;).permitAll()
                .antMatchers(&quot;/main&quot;).hasAnyRole(&quot;USER&quot;,&quot;ADMIN&quot;)
                .antMatchers(&quot;/admin&quot;).hasRole(&quot;ADMIN&quot;)
                .anyRequest().authenticated()
                .and()
                .formLogin()
                .loginPage(&quot;/login&quot;)
                .defaultSuccessUrl(&quot;/main&quot;)
        ;
    }</code></pre><ul>
<li>csrf().disable() 로 csrf라는 보안정책을 꺼두었는데 이부분은 나중에 따로 다루겠습니다.</li>
<li>authorizeRequests : url에 대한 권한을 부여하겠다 선언하는 함수(인가) </li>
<li>antMatchers : url을 설정하는 함수</li>
<li>permitAll : 권한 없이도 앞의 antMatchers의 url을 접속할 수 있게 하는 함수</li>
<li>hasAnyRole : 권한을 설정하여 그 권한만이 antMatchers의 url을 접속할 수 있게 하는 함수
(hasRole로 단일 권한 부여 가능)</li>
<li>anyRequest : 특정 url말고 모든 요청을 정의</li>
<li>authenticated : 로그인한 모든 요청을 허용</li>
<li>formLogin : form 형태의 로그인을 하겠다</li>
<li>loginPage : login페이지의 url을 설정하겠다(안하면 security 자체 로그인 페이지 설정)</li>
<li>defaultSuccessUrl : 로그인 성공하면 로그인 성공 화면을 출력 하겠다</li>
</ul>
<hr>
<h3 id="websecurity-web">WebSecurity web</h3>
<p>Spring Security에서 web 보안에 관련된 부분 입니다.
본인도 이부분은 이해가 잘 가지않아 관련하여 이해도가 높으신 분은 댓글로 설명 부탁드립니다.</p>
<pre><code>    @Override
    public void configure(WebSecurity web) {
        web.ignoring().antMatchers(&quot;/css/**&quot;, &quot;/js/**&quot;, &quot;/img/**&quot;);
    }</code></pre><ul>
<li>ignoring : 웹 보안을 허용</li>
</ul>
<hr>
<h3 id="authenticationmanagerbuilder-auth">AuthenticationManagerBuilder auth</h3>
<p>Spring Security에서 로그인 인증을 관리하는 메소드 입니다.
이부분에 대해선 이후 챕터에서 다룰 예정입니다.<em>(로그인과 관련 되어서 설명하기 위해)</em>
기본적인 메소드 형식은 코드만 보고 넘어가 주시면 됩니다.</p>
<pre><code>    @Override
    protected void configure(AuthenticationManagerBuilder auth) throws Exception {
        // TODO Auto-generated method stub
        auth.authenticationProvider(authenticationProvider());
    }</code></pre><hr>
<p>이렇게 Spring Security에서 없어서는 안되는 SecurityConfig에 대해 알아보았습니다.
궁굼한점이나 틀린부분 있으면 댓글로 욕해주세요.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[후기]데이터분석 청년인턴 일경험수련생💥]]></title>
            <link>https://velog.io/@dcis___/%ED%9B%84%EA%B8%B0%EB%8D%B0%EC%9D%B4%ED%84%B0%EB%B6%84%EC%84%9D-%EC%B2%AD%EB%85%84%EC%9D%B8%ED%84%B4-%EC%9D%BC%EA%B2%BD%ED%97%98%EC%88%98%EB%A0%A8%EC%83%9D</link>
            <guid>https://velog.io/@dcis___/%ED%9B%84%EA%B8%B0%EB%8D%B0%EC%9D%B4%ED%84%B0%EB%B6%84%EC%84%9D-%EC%B2%AD%EB%85%84%EC%9D%B8%ED%84%B4-%EC%9D%BC%EA%B2%BD%ED%97%98%EC%88%98%EB%A0%A8%EC%83%9D</guid>
            <pubDate>Tue, 14 Mar 2023 03:59:00 GMT</pubDate>
            <description><![CDATA[<h1 id="데이터분석-일경험-수련생-1주차06230624🕐">데이터분석 일경험 수련생 1주차(06.23~06.24)🕐</h1>
<p>한국지능정보사회진흥원에서 추진하는 데이터분석 일경험 수련생에 최종 합격 하였다.
온라인 교육을 마치고 06.23~08.31까지 진행되는 오프라인 교육을 주차별로 후기를 작성하려 한다!
이 오프라인 교육을 마치면 9월부터 내년 2월까지 공공기관 및 공기업에서 인턴으로 일을 할 수 있다.</p>
<p>지금 이 글을 작성하는 시기는 06.30인데 내가 지금 하는 일을 작성하면 좋을 것 같다라는 생각에 작성 해 보기로 한다.</p>
<h2 id="1일차0623">1일차(06.23)</h2>
<p>6월 23일부터 시작한 데이터분석 일경험 수련생!
첫날은 파이썬 문법부터 배웠다..
전공자도 있지만 비전공자도 많기에 아주 기초적인 것 부터 배웠다.
이날 배운 것은... 산토끼문제!
기본적인 문자열에서 원하는 문자를 찾는 알고리즘과 numpy를 배웠다.</p>
<pre><code>#산토끼 문제
#내가 푼 문제
song = &quot;&quot;&quot;산토끼 토끼야 어디로 가느냐 깡총깡총 뛰면서 어디를 가느냐
산고개 고개를 나혼자 넘어서토실토실 알밤을 주워서 올 테야&quot;&quot;&quot;
def get_count(str, char):
    cnt = str.count(char)
    print(cnt)
get_count(song,&quot;토&quot;)</code></pre><pre><code>#제시 답안
song = &quot;&quot;&quot;산토끼 토끼야 어디로 가느냐 깡총깡총 뛰면서 어디를 가느냐
산고개 고개를 나혼자 넘어서토실토실 알밤을 주워서 올 테야&quot;&quot;&quot;
def get_count(str, char):
  cnt = 0
  for i in str:
    if i == char:
      cnt += 1
  print(cnt)
get_count(song, &quot;토&quot;)</code></pre><p>보면 내 코드가 더 좋음👁‍🗨
아닌가...
이후 numpy를 배웠는데 기본적인 실습만 하였다
numpy는 학교 프로젝트에서 굳이 사용할 일이 없어서 조금 힘들었음</p>
<h2 id="2일차0624">2일차(06.24)</h2>
<p>이땐 pandas를 배웠던 거 같다.
pandas는 들어만 봤지 제대로 사용해보고 공부한적은 한번도 없었다.
그래도 이때는 &#39;난 전공자야&#39; 라는 쓸모없는 자신감을 가지고 있었던지라... 제대로 안들은듯
지금은 집에서도 따로 공부하는중..너무어려워
pandas를 이용해 csv 파일을 읽어오는 예제와 기본적인 pandas 함수를 몇가지 공부하고 한주를 마쳤다.</p>
<blockquote>
<h3 id="1주차-후기💬">1주차 후기💬</h3>
<p>음 솔직히 1주차만 듣고 나선 &#39;뭐 이런걸 배워서 실무에 어떻게 사용하지?&#39; 라는 의문이 들었다.
나야 뭐 4-2학기 과정만 남아서 학기 중에 인턴을 하는것도 나쁘지 않겠다 생각해서 들었지만 취업이 급급한 사람들은 좀 비추천..? 느낌이 든다.
이만 글을 마치자</p>
</blockquote>
]]></description>
        </item>
        <item>
            <title><![CDATA[Spring Legacy Security 설정법-2]]></title>
            <link>https://velog.io/@dcis___/Spring-Legacy-Security-%EC%84%A4%EC%A0%95%EB%B2%95-2</link>
            <guid>https://velog.io/@dcis___/Spring-Legacy-Security-%EC%84%A4%EC%A0%95%EB%B2%95-2</guid>
            <pubDate>Tue, 14 Mar 2023 03:58:18 GMT</pubDate>
            <description><![CDATA[<h1 id="spring-security-설정방법">Spring Security 설정방법</h1>
<h3 id="pomxml-설정">pom.xml 설정</h3>
<pre><code>&lt;!-- Spring Security --&gt;
        &lt;dependency&gt;
            &lt;groupId&gt;org.springframework.security&lt;/groupId&gt;
            &lt;artifactId&gt;spring-security-web&lt;/artifactId&gt;
            &lt;version&gt;${spring.security.version}&lt;/version&gt;
        &lt;/dependency&gt;

        &lt;dependency&gt;
            &lt;groupId&gt;org.springframework.security&lt;/groupId&gt;
            &lt;artifactId&gt;spring-security-config&lt;/artifactId&gt;
            &lt;version&gt;${spring.security.version}&lt;/version&gt;
        &lt;/dependency&gt;

        &lt;dependency&gt;
            &lt;groupId&gt;org.springframework.security&lt;/groupId&gt;
            &lt;artifactId&gt;spring-security-core&lt;/artifactId&gt;
            &lt;version&gt;${spring.security.version}&lt;/version&gt;
        &lt;/dependency&gt;

        &lt;dependency&gt;
            &lt;groupId&gt;org.springframework.security&lt;/groupId&gt;
            &lt;artifactId&gt;spring-security-taglibs&lt;/artifactId&gt;
            &lt;version&gt;${spring.security.version}&lt;/version&gt;
        &lt;/dependency&gt;</code></pre><p>Spring Security는 자바 버전에 맞추어 설정하는 것이 좋습니다.
본인은 자바 1.8 / tomcat 8.5 / security 4.2.3 사용하였습니다.</p>
<hr>
<h3 id="webxml-설정">web.xml 설정</h3>
<pre><code>&lt;filter&gt;
        &lt;filter-name&gt;springSecurityFilterChain&lt;/filter-name&gt;
        &lt;filter-class&gt;org.springframework.web.filter.DelegatingFilterProxy&lt;/filter-class&gt;
    &lt;/filter&gt;

    &lt;filter-mapping&gt;
        &lt;filter-name&gt;springSecurityFilterChain&lt;/filter-name&gt;
        &lt;url-pattern&gt;/*&lt;/url-pattern&gt;
&lt;/filter-mapping&gt;</code></pre><p>Spring Security를 이용을 위해 SecurityFilterChain을 등록해야 합니다.</p>
<hr>
<h3 id="root-contextxml-설정">root-context.xml 설정</h3>
<pre><code>&lt;context:component-scan base-package=&quot;com.egis.springsecurity&quot;&gt;
         &lt;context:include-filter type=&quot;annotation&quot; expression=&quot;org.springframework.stereotype.Repository&quot;/&gt;
         &lt;context:include-filter type=&quot;annotation&quot; expression=&quot;org.springframework.stereotype.Service&quot;/&gt;
         &lt;context:include-filter type=&quot;annotation&quot; expression=&quot;org.springframework.stereotype.Component&quot;/&gt;
&lt;/context:component-scan&gt;</code></pre><p>이 부분에서 가장 많이 고생했습니다.</p>
<p>Java Config를 사용할 예정이었기 때문에 Spring FilterChain에 대한 것은 자동으로 Java Config에서 등록될 줄 알았는데, 계속해서 오류가 발생하여 고생하게 되었습니다.</p>
<p>그러나, <code>root-context</code>에 해당 부분을 추가하면 문제를 해결할 수 있습니다.</p>
<hr>
<h3 id="servlet-contextxml-설정">servlet-context.xml 설정</h3>
<pre><code>&lt;context:component-scan base-package=&quot;com.egis.springsecurity&quot;&gt;
         &lt;context:include-filter type=&quot;annotation&quot; expression=&quot;org.springframework.stereotype.Repository&quot;/&gt;
         &lt;context:include-filter type=&quot;annotation&quot; expression=&quot;org.springframework.stereotype.Service&quot;/&gt;
         &lt;context:include-filter type=&quot;annotation&quot; expression=&quot;org.springframework.stereotype.Component&quot;/&gt;
&lt;/context:component-scan&gt;

&lt;context:annotation-config&gt;&lt;/context:annotation-config&gt;</code></pre><p>이 부분에도 component-scan을 추가하였습니다.(혹시몰라)
또한 annotation을 사용하기 위해 annotation-config도 추가하였습니다</p>
<hr>
<h3 id="bean-등록">bean 등록</h3>
<p><img src="https://velog.velcdn.com/images/dcis___/post/dbcc3071-4eea-4b6e-96c6-c51b6e83aa34/image.png" alt=""></p>
<p>사진과 같이 root-context, servlet-context에 bean도 등록해 주어야 합니다.</p>
<hr>
<p>이렇게만 하면 Spring Seucrity 설정의 기본적인 단계는 끝났습니다.
다음엔 Java단에서 설정하는 방법에 대해 포스팅 하겠습니다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[Spring Legacy Security 설정법-1]]></title>
            <link>https://velog.io/@dcis___/Spring-Legacy-Security-%EC%84%A4%EC%A0%95%EB%B2%95</link>
            <guid>https://velog.io/@dcis___/Spring-Legacy-Security-%EC%84%A4%EC%A0%95%EB%B2%95</guid>
            <pubDate>Tue, 14 Mar 2023 02:41:19 GMT</pubDate>
            <description><![CDATA[<h1 id="spring-security란">Spring Security란?</h1>
<p>Spring Security는 Spring 기반의 웹 어플리케이션 보안 프레임워크입니다.
Spring Security는 인증, 권한 부여 및 기타 보안기능을 제공하는 프레임워크입니다.</p>
<h1 id="spring-security의-주요-기능">Spring Security의 주요 기능</h1>
<h3 id="--인증authentication-">- 인증(Authentication) :</h3>
<ul>
<li>사용자가 누구인지 확인하는 과정입니다. Spring Security는 다양한 인증 방식을 지원합니다. 예를 들어, 폼 로그인, 기본 인증, OAuth2, LDAP 등이 있습니다.</li>
</ul>
<h3 id="--권한-부여authorization-">- 권한 부여(Authorization) :</h3>
<ul>
<li>인증된 사용자가 특정 자원에 접근할 수 있는지 확인하는 과정입니다. Spring Security는 다양한 권한 부여 방식을 지원합니다. 예를 들어, URL 기반 권한 부여, 메소드 기반 권한 부여 등이 있습니다.</li>
</ul>
<h3 id="--보안-헤더security-header-">- 보안 헤더(Security Header) :</h3>
<ul>
<li>Spring Security는 보안 헤더를 자동으로 추가하여 웹 어플리케이션의 보안을 높입니다. 예를 들어, X-Content-Type-Options, X-XSS-Protection, X-Frame-Options 등이 있습니다.</li>
</ul>
<h3 id="--csrf-공격-방어-">- CSRF 공격 방어 :</h3>
<ul>
<li>Spring Security는 CSRF(Cross-site request forgery) 공격을 방어하기 위한 기능을 제공합니다. 예를 들어, CSRF 토큰을 사용하는 방어 기능이 있습니다.</li>
</ul>
<h3 id="--세션-관리session-management-">- 세션 관리(Session Management) :</h3>
<ul>
<li>Spring Security는 세션 관리를 위한 기능을 제공합니다. 예를 들어, 세션 타임아웃, 세션 고정 보호 등이 있습니다.</li>
</ul>
<h2 id="spring-security의-구성-요소">Spring Security의 구성 요소</h2>
<p>Spring Security는 아래와 같은 구성 요소로 구성됩니다.</p>
<ul>
<li>Security Filter : Spring Security의 가장 핵심적인 구성 요소입니다. Security Filter는 웹 어플리케이션으로 들어오는 모든 요청에 대해 인증 및 권한 부여를 처리합니다.</li>
<li>Authentication Manager : Security Filter가 인증을 처리할 때 사용하는 인증 매니저입니다. 인증 매니저는 인증 제공자(Authentication Provider)를 사용하여 사용자를 인증합니다.</li>
<li>Authorization Manager : Security Filter가 권한 부여를 처리할 때 사용하는 권한 부여 매니저입니다. 권한 부여 매니저는 접근 결정자(Access Decision Manager)를 사용하여 사용자에게 권한을 부여합니다.</li>
<li>UserDetailsService : 인증 매니저가 인증 제공자를 사용하여 사용자를 인증할 때 사용하는 사용자 정보 서비스입니다. UserDetailsService는 사용자 정보를 데이터베이스, LDAP, 인-메모리 등에서 가져올 수 있습니다.</li>
</ul>
]]></description>
        </item>
    </channel>
</rss>