728x90

프로그래밍/java 18

[spring] 스프링부트의 로그 시스템

스프링부트의 로그 시스템 스프링부트는 기본라이브러리에 slf4j 라는 로그 인터페이스를 가지고 있다. 이는 스프링 부트가 다양한 로그라이브러리를 스프링에서 사용할 수 있도록 하기 위함이다. 개발자가 다른 로그 구현체 라이브러리를 사용할수도 있고 기본으로 스프링부트가 제공하는 logback을 사용할 수 있다. 로그 선언 org.slf4j.Logger; org.slf4j.LoggerFactory; private final Logger log = LoggerFactory.getLogger(getClass()); slf4j의 LogFactory로부터 getLogger를 통해 로거를 받으면된다. 롬복을 사용할 경우 별도로 인스턴스를 생성할 필요없이 @slf4j애노테이션을 클래스에 붙이면된다. 로그 출력내용 로그라..

[스프링] 스프링 빈으로 등록된 컴포넌트의 동시성문제 (쓰레드로컬)

예전에 나와 신입사원 2명이 한 달예정 프로젝트에 투입된 적이 있었다. 이 프로젝트가 아주 소규모에 한 달이라는 프로젝트였던 것은 이미 어느정도 개발이 된 상태의 프로젝트여서 였다 다만 엔티티와 dto의 변수명이 일본어여서 이것을 영문으로 바꿔달라는 의뢰였다. 분명히 이미 돌아간다고 했는데 받고나서보니 내부가 뒤죽박죽이었다. 컨트롤러에서 직접 sql을 날리는데 서비스와 리파지토리는 따로 있어 코드를 파악하기 힘들었다. 컨트롤러와 서비스와 리포지토리의 구분은 진짜 개발자들의 피땀의 산물이라 느꼈다. 규칙을 지키는 코드는 이후 수정할 개발자에 대한 배려와 매너임을 알았다. 이중에서 심각한건 바로 컨트롤러 필드의 접근시간을 가지고 화면의 최신화를 확인한다는 점이었다. 이 프로젝트는 관리자용 시스템이라 동시에 ..

[spring] 스프링 AOP는 언제 사용하지

스프링은 DI, AOP이 핵심이다. 이중 AOP 관점지향프로그래밍이란 무엇일까? 보통 프로그래밍을 할 때 흐름은 기능의 처리 순서이다. HTTP 요청을 서블릿이 받아 url 리퀘스트 매핑을 통해 적절한 컨트롤러로 연결해주면 컨트롤러에서 비지니스로직을 호출하고 결과를 반환해 화면으로 돌려준다. 그런데 때때로 이 처리 순서의 흐름이 아니라 어떤 특정 시점에서 공통된 처리를 해주고 싶을 때가 있다. 나 같은 경우 로그나 시간을 측정할 때 사용해봤다. 포인트컷을 지정하면 실행 전후의 로그를 남길 수 있는데 여기서 시작시간과 처리종료시간을 계산하면 처리시간을 구할 수 있다. 각 처리에 하나하나 로그와 시간을 계산하지 않아도 된다. 우리에겐 스프링 AOP가 있으니까 스프링 AOP는 스프링 빈을 등록할 때 프록시를 ..

[spring] spring AOP

스프링 AOP Aspect oriented Programming 관점지향 프로그래밍 스프링 AOP란 관점지향 프로그래밍을 말한다. AOP가 필요한 이유 핵심기능과 부가기능 핵심기능 REST API를 보면 resource의 표현을 통해 통신을 하는데 보통 해당 리소스의 어떤 처리를 하게된다. 해당 처리, 즉 해당 요청에 대한 기능을 핵심기능이라고 한다. 예를 들어 POST방식으로 주문 데이터를 전송한다면 해당 리퀘스트의 핵심기능은 주문의 등록일 것이다. 부가기능 그러나 우리가 로직을 짤 때 해당기능을 수행하기 위해 부가되는 기능이 있다. 예를 들어 로그를 남긴다거나, 처리시간을 넣거나 혹은 DB와 통신을 위한 코드이다. 반복되는 부가기능 로그를 남기거나 처리시간을 계산하는 로직이 하나의 핵심기능의 객체에만..

[spring] MappedSuperClass

MappedSuperclass Entity의 공통된 속성 필드를 묶어서 별도의 클래스를 만들 때 썻다. package를 보면 package javax.persistence; 영속성을 위해 도입된 인터페이스를 보인다. 아래와 같이 정의된 부분을 해석해보자면 MappedSuperclass 인터페이스를 구현한 클래스는 그 자체로 별도의 테이블을 갖지 않는다. 그러나 이 MappedSuperclass 어노테이션으로 지정된 클래스는 상속을 통해서 엔티티에서 지정한 속성과 같이 매핑이 된다. 즉 공통된 부분을 별도의 클래스로 정의한 후 MappedSuperclass 어노테이션으로 지정해준 뒤 entity에서 해당 클래스를 상속을 받게 된다면 굳이 entity에서 매핑해주지 않아도(속성으로 선언해주지 않아도) 알아서..

[spring] CommunicationsException-Communications link failure

해결방법 : MySQL 서버를 실행시키자 !!!!!!!!!! 서버를 구동했을 때 아래와 같은 연결실패 에러가 생겼다.. mysql과의 소통이 실패했다. 연결 실패, 서버가 패킷을 안받는다. com.mysql.cj.jdbc.exceptions.CommunicationsException: Communications link failure com.mysql.cj.jdbc.exceptions.CommunicationsException: Communications link failure The last packet sent successfully to the server was 0 milliseconds ago. The driver has not received any packets from the server...

java와 메모리

프로그램을 실행을 시키면, 메모리에 해당 프로그램이 올라간다. 이렇게 실행되고 있는 프로그램을 우리는 프로세스라고 부르고 쓰레드 형태로 실행을 한다. 프로세스는 두가지 영역을 가지는데 Data(static or 상수)영역 : 프로세스 로딩시에 올라가야하는 데이터, 상수, 스테틱변수, 리터럴이 올라간다. code영역 : 주로 명령어들의 공간 instruction set 한줄씩 자바프로그램을 실행시키면 위에서 말한 프로세스에서 사용하는 공통메모리 부분에 로딩하면서부터 리터럴이나 상수, static변수를 올린다. 코드영역에서는 코드가 올라가면서 한 줄씩 실행을 한다. 이 메모리 부분의 데이터들은 실행시에 로딩이 되고, 프로그램을 종료하면 없어지게 된다. 명령어를 실행하다가 함수(메소드)를 호출하게 되면, 함수..

728x90