일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
- nodejs
- LOG4J
- Kubernetes
- Spring
- springboot
- useEffect
- IntelliJ
- database
- gson
- log4j2
- nginx
- docker
- react
- jetbrains
- wildfly
- Windows
- intellijIDEA
- VSCode
- MySQL
- Git
- NCP
- gradle
- BPMN
- dbeaver
- JPA
- tibero
- Java
- JavaScript
- mybatis
- kubectl
- Today
- Total
목록분류 전체보기 (247)
두 손끝의 창조자
대용량 파일을 읽어 라인별 처리를 하는 것을 시도하였다. DirectByteBuffer를 사용한 이유는 대용량 데이터를 시스템에서 읽어서 jvm에 올리는 비용을 줄이고자 함이었다. 내가 필요한 작업은 파일을 일어서 행별로 읽어들이는 거였는데 DirectByteBuffer는 행단위 Reader를 제공하지 않는다. 그래서 별도로 구현을 했는데 구현 과정에 byte배열에 복사하고 하는 과정이 제법 있어서그런지 이렇다할 성능개선은 보이지 았았고 오히려 느려졌다. DirectByteBuffer는 데이터를 읽어 별도로 다른 buffer에 넣지 않고 즉시처리, 예를 들어서 다른 socket으로 보낸다던지 하는 경우 성능개선에 도움이 될 것같다. import sun.nio.ch.DirectBuffer; import j..
github에서 PR을 올렸는데 실패하거나 수정 요청이들어오면 어떻게 하나? 일단 PR에 올라가는 커밋은 단일 커밋으로 해야 프로젝트 이력관리에 유리하게 때문에 그렇게 해야한다. 수정을 하면 커밋이 하나 더 발생할 텐데 그럼 어떻게 하냐? 로컬에서 변경사항을 만들어서 커밋 한 뒤에 한 커밋으로 다시 만든다. 한 커밋으로 만드는 것은 rebase --interactive로 해도 되고 내 같은 경우는 그냥 git commit --amend 로 전 커밋과 바로 합쳐서 한 커밋으로 만들었다. push -f 로 강제로 올리면 github에 올라간 pr도 같이 자동으로 새로운 커밋id로 변경되면서 다시 프로세스가 진행된다. 긋긋 가장 좋은건 올리기전에 체크체크체크
파일을 찾을 수 없을 때 주로 이 예외가 발생하지만, 파일이 너무 많이 열려있어서 OS에서 파일 여러는 것을 막아버릴수도 있다. 이때도 FileNotFoundException 이 발생한다. 메시지는 "Too many open files". 현재 OS에 설정되어 있는 최대 파일 오픈가능 개수를 확인한다. ulimit –a 명령어로 open files 설정값을 확인한 뒤 현재 특정 프로세스에 의해 열린 파일들도 확인한다. lsof -i :[port] 로 특정 포트를 사용하고 있는 프로세스를 확인한다. lsof -p [PID] | wc –l 로 현재 오픈되어 있는 파일들의 개수를 확인하고 적절한 값으로 변경한다. ulimit -n [변경개수] 명령어로 변경한다.
NioEndpoint->AbstractProtocol#process->Http11Processor#service->CoyoteAdapter#service 프로토콜이(HTTP/1.1 이면 Http11NioProtocol) 소켓에서 요청 정보를 받아서 처리할 프로세서를 가져온다. 프로세서는 AbstractProcessorLight를 구현한 구현체가 반환될텐데 HTTP/1.1이면 Http11Processor를 선택 할 것이다. 프로토콜은 프로세서의 service 메소드를 호출하면서 요청처리를 넘긴다. 프로세서에서는 처음으로 Request, Response 객체가 등장하고 CoyoteAdapter의 Service를 호출하면서 컨테이너에 Resquest와 Response객체를 넘긴다.
HTTP 커넥터 요소는 HTTP / 1.1 프로토콜을 지원하는 커넥터 구성 요소를 나타냅니다. 이를 통해 Catalina는 서블릿 및 JSP 페이지를 실행하는 기능 외에도 독립형 웹 서버로 작동할 수 있습니다. 이 구성 요소의 특정 인스턴스는 서버의 특정 TCP 포트 번호에서 연결을 수신합니다. 하나 이상의 이러한 커넥터를 단일 서비스의 일부로 구성 할 수 있으며, 각각은 요청 처리를 수행하고 응답을 생성하기 위해 연관된 엔진으로 전달합니다. 들어오는 각 요청에는 해당 요청 기간 동안 스레드가 필요합니다. 현재 사용 가능한 요청 처리 스레드에서 처리할 수 있는 것보다 더 많은 동시 요청이 수신되면 구성된 최대 값 (maxThreads 속성 값)까지 추가 스레드가 생성됩니다. 더 많은 동시 요청이 수신되면..
서블릿이 올바르게 초기화된 후, 서블릿 컨테이너는 이를 사용하여 클라이언트 요청을 처리할 수 있습니다. 요청은 ServletRequest 유형의 요청 오브젝트로 표시됩니다. 서블릿은 ServletResponse 유형의 제공된 오브젝트의 메서드를 호출하여 요청에 대한 응답을 채 웁니다. 이 오브젝트는 Servlet 인터페이스의 서비스 메서드에 매개 변수로 전달됩니다. HTTP 요청의 경우 컨테이너가 제공하는 객체는 HttpServletRequest 및 HttpServletResponse 유형입니다. 서블릿 컨테이너가 서비스에 배치 한 서블릿 인스턴스는 수명 동안 요청을 처리할 수 없습니다. 멀티 스래드 이슈 서블릿 컨테이너는 서블릿의 서비스 메소드를 통해 동시에 여러 요청을 보낼 수 있습니다. 요청을 처리..
서블릿이란? 서블릿은 컨테이너로 관리되는 동적 콘텐츠를 생성하는 Java ™ 기술 기반 웹 컴포넌트입니다. 다른 Java 기술 기반 구성 요소와 마찬가지로 서블릿은 플랫폼에 독립적인 Java 클래스로, 플랫폼에 중립적인 바이트 코드로 컴파일되어 Java 기술 지원 웹 서버에 동적으로 로드되어 실행될 수 있습니다. 서블릿 엔진이라고도하는 컨테이너는 서블릿 기능을 제공하는 웹 서버 확장입니다. 서블릿은 서블릿 컨테이너에 의해 구현된 요청 / 응답 패러다임을 통해 웹 클라이언트와 상호 작용합니다. 서블릿 컨테이너란? 서블릿 컨테이너는 요청 및 응답이 전송되는 네트워크 서비스를 제공하고 MIME 기반 요청을 디코딩하며 MIME 기반 응답을 형식화하는 웹 서버 또는 애플리케이션 서버의 일부입니다. 서블릿 컨테이너..
web.xml에 두 필터를 설정할 때 순서가 매우 중요하다. Spring-Session이 먼저, Spring-Security가 이어서 와야한다.
프래임워크를 사용한 애플리케이션의 상태를 확인하기 위해서 오픈소스 성능 분석도구 Scouter를 적용해봤다. 구성요소 및 역할 1. 정보를 수집하는 Collector. 타겟에서 발생하는 이벤트를 수집한다. 타겟에 설치한 Host Agent와 Java Agent로 정보를 받는다. 6100 포트를 사용한다. 2. WAS가 설치된 서버의 상태를 컬렉터로 송신하는 Host Agent 3. WAS에 붙어서 애플리케이션 상태를 컬렉터로 송신하는 Java Agent 4. 컬렉터가 수집한 정보를 모니터링하는 Client. 이클립스 기반 클라이언트는 컬렉터의 ID를 환경설정에서 설정한 뒤 사용한다. 웹 버전 클라이언트도 공개되어 있다. 설치 아래 사이트에 접속한 뒤 최신버전을 다운로드 한다. 파일은 scouter-all..
어떤 클래스가 JpaRepository를 참조하기 위해서 @Autowired나 생성자, 속성으로 할 수 있다. Namespace로 빈을 선언할 때 생성자로 참조하기 위해서 JpaRepository를 넣어주면 참조하기 못하는 현상을 발견했다. 이걸 그냥 Autowired로 바꾸면 잘 되는데.... 아무래도 생성자 방식으로 했을 때 JpaRepository가 아직 Bean으로 만들어지지 않은 상황에서 생성자가 실행되어서 그렇지 싶다. 이걸 어떻게 극복을 하는지 모르겠다. 해결 Autowired로 인해서 잘 초기화된 것이 아니었다. 그냥 null로 바인드 되어서 잘 된 것처럼 보일 뿐... 이것만 봐도 그냥 Autowired를 쓰는 것보다는 생성자로 명시적으로 받는 것이 오류를 미리 발견할 수 있다. 참조하지..
linux lsof -i :1099 windows netstat ano|find "1099"
http .authorizeRequests() .accessDecisionManager(applicationContext.getBean("accessDecisionManager", AccessDecisionManager.class)) http .authorizeRequests() .accessDecisionManager(accessDecisionManager()) 어느 방법이 효율적일까? accessDecisionManager()으로 호출해도 새로운 객체가 생성되지는 않는다. 왜일까?
시스템이 초기화되면서 AccessDecisionManager에 등록된 Voter가 Configuration에서 설정한 속성을 지원하는지 검사하도록 되어있다. 같은 코드임에도 불구하고 XML로 정의하면 정상동작하고, Java Config로 정의하면 실패했다. @Override public boolean supports(ConfigAttribute attribute) { return attributes.contains(attribute.getAttribute()); } XML로 정의할 때 use-expressions="false" 로 넣어주면 attribute.getAttribute()로 access 에 넣었던 값, 또는 표현식을 가져올 수 있었는데 Java Configuration에서는 null 이 리턴되..
HttpSecurity는 네임 스페이스 구성에있는 Spring Security의 XML 요소와 유사합니다. 특정 http 요청에 대해 웹 기반 보안을 구성 할 수 있습니다. 기본적으로 모든 요청에 적용되지만 requestMatcher (RequestMatcher) 또는 기타 유사한 메소드를 사용하여 제한 할 수 있습니다. @Configuration @EnableWebSecurity public class FormLoginSecurityConfig extends WebSecurityConfigurerAdapter { @Override protected void configure(HttpSecurity http) throws Exception { http.authorizeRequests().antMatche..
org.springframework.security.config.annotation.web.configuration.WebSecurityConfiguration은 WebSecurity를 사용하여 Spring Security에 대한 웹 기반 보안을 수행하고 Spring Security Filter Chain이라고 부르는 FilterChainProxy를 만든다. 그런 다음 필요한 Bean을 내 보냅니다. WebSecurityConfigurerAdapter를 확장하여 구성으로 노출하거나 WebSecurityConfigurer를 구현하고이를 구성으로 노출하여 WebSecurity를 사용자 정의 할 수 있습니다. EnableWebSecurity를 사용할 때이 구성을 가져옵니다. springSecurityFilte..
이 Appender에 환경변수값을 바인딩할 수 있는 표현식 ${sys:key} 에서 환경변수에 그 값이 없으면 기본값으로 가지도록 하고자 할 때는 local 에 를 추가하면 된다. 표현식 내에서 직접 넣고 싶으면 ${sys:fileHourName:-하고싶은값} 형태로 선언하면 된다. 프로퍼티 내에 표현식이 있을 때도 마찬가지로 하면 된다. INFO ${sys:systemLogLevel} http://logging.apache.org/log4j/2.x/manual/configuration.html#PropertySubstitution
에 entry-point-ref를 설정하지 않으면 ExceptionTranslationFilter를 만들 때 설정되지 않았다고 예외가 발생한다. entry-point-ref 는 인증 실패 등 요청한 자원에 접근을 할 수 없을 때 어떻게 그다음을 진행할지 결정하는 빈을 등록하는 속성이다. 예를 들어 접근 권한이 필요한 자원을 요청했을 때 로그인 페이지로 리다이렉션 된다던지, API를 호출했을 때 JSON으로 응답 결과를 보낸다던지 하는 것이다. 스프링 시큐리티에서 필터를 만들때 entry-point-ref 속성이 없는 경우, 하위 요소 중에 http-basic, form-login, openid-login 요소가 있는지 확인하고 없으면 예외를 발생시킨다. 즉, entry-point-ref 를 지정하던지 로..
HttpClient 전송중에 커넥션에 끊기면 자동적으로 재송신 시도를 한다. 필요에 따라 재전송하면 안되는 경우에 하는 조치이다. HttpClientBuilder.create().disableAutomaticRetries().build();
hibernate 프로퍼티 설정 hibernate.show_sql = false hibernate.format_sql = true hibernate.user_sql_comments = true log4j2 설정 스프링부트에서는 spring.jpa.properties.hibernate.format_sql=true spring.jpa.properties.hibernate.show_sql=false logging.level.org.hibernate.SQL=debug logging.level.org.hibernate.type=trace
org.springframework.context.support.AbstractApplicationContext Class 확인 @Override public void refresh() throws BeansException, IllegalStateException { synchronized (this.startupShutdownMonitor) { // Prepare this context for refreshing. prepareRefresh(); // Tell the subclass to refresh the internal bean factory. ConfigurableListableBeanFactory beanFactory = obtainFreshBeanFactory(); // Prepare th..