728x90

Backend 150

SpringBoot ServletFilter 구현

전체코드는 아래 github을 참고하도록 한다. github.com/mypiece/springboot-example/tree/master/filter-example mypiece/springboot-example 스프링부트 예제. Contribute to mypiece/springboot-example development by creating an account on GitHub. github.com SpringBoot 환경에서 ServletFilter 자체는 아래와 같이 간단하게 정의 가능하다. public class TestFilter extends OncePerRequestFilter { protected void doFilterInternal( HttpServletRequest request ,..

Backend/Spring+Boot 2021.03.16

@ServletComponentScan

SpringBoot 환경에서 basePackages 하위 서블릿컴포넌트(필터, 서블릿, 리스너)를 스캔해서 빈으로 등록한다. 다만 서블릿컴포넌트를 그냥 등록하는게 아니고 해당 서블릿컴포넌트 클래스에는 아래와 같이 별도의 어노테이션이 추가되어 있어야 한다. 필터: @WebFilter 서블릿: @WebServlet 리스너: @WebListener 이는 SpringBoot의 내장톰캣을 사용하는 경우에만 동작한다.

Backend/Spring+Boot 2021.03.16

response.sendRedirect 에 대한 오해

특정페이지로 리다이렉트 시키고 싶은 경우 response.sendRedirect() 메소드를 사용하곤 한다. 그런데 너무 예전에 생각없이 쓰던거라 이제라도 잘못된 지식을 바로 잡고자 한다. 나는 이 메소드를 사용할 경우 암시적으로 프로그램의 흐름이 종료되는 것으로 알고 있었다. 즉, return 과 같은 역할이 기본적으로 포함되어 있다고 착각하고 있었다. 결론부터 말하면 전혀 그렇지 않다. 지금까지 이렇게 착각하고 있어도 아무 문제가 없고 더 찾아보지 않았던 이유가 response.sendRedirect() 를 항상 마지막에 처리했기 때문인데 response.sendRedirect() 메소드는 response 헤더에 어느 페이지로 리다이렉트 하라는 정보를 넣는 것 뿐 실제로 프로그램의 흐름을 종료하진 않..

Filter, Interceptor, AOP

Filter, Interceptor, AOP 모두 어떠한 행동을 하기 전/후에 처리될 공통프로세스를 별도로 정의해 놓은 것들이다. ​ 가장 큰 차이는 적용시점으로 Spring 환경을 기준으로 보면 DispatcherServlet 진입전 Filter 가 적용되고, DispatcherServlet 진입후 Controller 메소드 진입 전에 Interceptor 가 적용되고 이어서 AOP가 적용된다. 그렇기 때문에 Interceptor, AOP에서는 Spring Bean을 참조할 수 있지만 Filter에서는 참조할 수 없다. ​ 일반적으로 Filter는 Request, Response 자원 자체를 변경하는 용도로 한글처리를 위한 인코딩이나 XSS 공격 방어를 위한 HTML 태그 치환에 사용된다. ​ Inte..

Backend/Spring+Boot 2021.03.16

ThreadLocal

Java에서 Thread의 로컬 컨텍스트 변수로 Thread 가 존재하는 한 계속해서 남아 있는 변수이다. ThreadPool 에서 Thread를 관리하며 request당 하나의 Thread 를 사용하는 웹서버 특성상 하나의 request에서 공유되는 변수라고 생각하면 된다. 이걸 어디에 활용할 수 있나? 예를 들어 클래스끼리 전역으로 참조하고 싶은 데이터가 있다고 생각해보자. java에서 가장 먼저 떠오르는 것은 static 변수이다. 하지만 static 변수는 모든 Thread 에서 공유되고 웹서버는 기본적으로 Multi Thread 방식이기 때문에 Thread Safe 하지 않다. 이때 Thread Local 을 사용할 경우 클래스끼리 전역적으로 참조할 수 있지만 다른 Thread에서는 참조할 수 ..

Backend/Java 2021.03.16

httpd-vhosts.conf mod_rewrite

httpd-vhosts.conf 파일에서 같은 태그 하위에 rewrite 설정을 통해 Request을 분석해서 새로운 url로 Redirect 또는 Rewrite 처리할 수 있다. Redirect는 브라우저 url도 바뀌면서 아예 새로운 요청을 수행하는 것이고 Rewrite는 브라우저 url은 유지되지만 apache 내부적으로 요청을 재처리하는 것이다. Forward 와 비슷한거 같은데 명확한 차이는 아직 찾지 못했다.. 당장 생각나는건 시도하는 곳이 각각 web, was 라는 차이가 있는 것 같긴하다. 이 기능을 사용하려면 우선 옵션을 명시적으로 on 해야 하고대략 아래와 같이 사용할 수 있다. RewriteEngine on RewriteCond %{HTTP:X-Forwarded-Proto} =http..

Backend/Server 2021.03.15

httpd-default.conf 설정 분석

Timeout 120 # 말그대로 타임아웃 시간. 10 이하 권장. KeepAlive On MaxKeepAliveRequests 0 # keepalive 가 on 일때 연결당 허용되는 요청 건수. 0은 무제한을 의미함. 100 이상 권장 KeepAliveTimeout 10 # keepalive 가 on 일때 후속요청을 대기하는 시간. 15초 이하 권장 UseCanonicalName Off AccessFileName .htaccess ServerTokens Prod ServerSignature Off #오류페이자와 같은 서버생성 문서에 서명 등 추가정보 표기 제한 HostnameLookups Off 찾는데로 추가해나갈 예정

Backend/Server 2021.03.15

Thymeleaf 정리

jsp+tiles 를 조합해놓은 느낌이다. 단, was 에 비종속적이다. html 확장자로 view파일을 생성할 수 있고 브라우저가 해석가능한 마크업 언어만으로 구성되기 때문에 was를 통하지 않고 브라우저에서 직접 열 수 있다. jsp도 브라우저에서 열수는 있지만 was에서만 해석할 수 있는 언어도 포함되어 있어 제대로 된 페이지가 렌더링 되지 않는다. 이를 통해 퍼블리셔 혹은 디자이너와 협업이 용이해진다. jsp와 다르게 view 에 java 코드를 포함할수 없게 된다. jsp는 was에서 서블릿으로 변환되어 실행되기 때문에 기본적으로 java코드를 포함할 수 있다. 이는 개발할때는 편리하지만 시간이 지나면서 소소의 복잡도가 올라서 유지보수가 매우 힘들어진다. 때문에 실무에서는 jsp에서 java코드..

Backend 2021.03.15

Spring DB 연동

SpringBoot 에서는 너무 많은 것을 자동으로 처리해주기 때문에 여기에서는 이해를 위해 Spring에서 JavaConfig로 직접 연동하는 법을 알아보자. 다만 Jpa 가 활성화 되기 시작했을 무렵 SpringBoot도 함께 활성화 되었고 Jpa를 사용하는 프로젝트는 대부분 SpringBoot를 사용할 것이다. 반면 Mybatis는 SpringBoot가 나오기 전부터 사용되던 전통적인 퍼시스턴스 프레임워크로 레거시 시스템들은 Spring+Mybatis 로 되어 있는 경우도 적지 않다. 이에 여기에서는 Mybatis만 연동 벙법만 살펴보고 추후 SpringBoot DB 연동에서는 Mybatis와 Jpa를 함께 살펴보도록 한다. 우선 Configuration 파일은 아래와 같이 정의한다. @Config..

Backend/Spring+Boot 2021.03.12

Mysql 유저 생성 및 권한설정

유저생성 일단 root 계정으로 접속한 상태에서 진행이 가능하다. ​ mysql 유저는 접속을 시도하려는 곳을 명시해서 아래와 같이 생성해야 한다. 아래는 로컬에서 접속할 수 있는 test 유저와 원격 접속 가능한 test 유저를 생성한 것이다. create user 'test'@'localhost' identified by 'test'; create user 'test'@'%' identified by 'test'; 유저 삭제명령도 아래와 같이 접속을 시도하려는 곳을 포함해서 진행한다. drop user 'test'@'localhost' identified by 'test'; drop user 'test'@'%' identified by 'test'; 생성한 유저는 아래와 같이 확인할 수 있다. use..

Backend/Database 2021.03.12
728x90