분류 전체보기 410

springboot + fluentd + mongoDB 연동

fluntd? 흔히 아는 ELK에 로그스테시와 같이 로그를 저장소에 적제하거나 필터링하고 어딘가로 전송해주는 큐 역할을 하는 툴입니다. 해당 글에선 docker를 사용해서 할 예정입니다. fluntd Dockerfile FROM fluent/fluentd:v1.11-debian-1 USER root RUN buildDeps="sudo make gcc g++ libc-dev" \ && apt-get update \ && apt-get install -y --no-install-recommends ${buildDeps} \ && sudo apt-get install -y libmariadb-dev \ && sudo gem install fluent-plugin-mongo \ && sudo gem instal..

Springboot 2023.08.16

spring boot logback으로 error 로그만 파일로 남기기

logback 해당 라이브러리는 spring-web에 들어있기때문에 따로 의존성을 설정해 둘 필요는 없습니다. %black(%d{ISO8601}) %highlight(%-5level) [%blue(%t)] %yellow(%C{1.}): %msg%n%throwable error ACCEPT DENY ${LOGS}/spring-boot-logger.log %d %p %C{1.} [%t] %m%n ${LOGS}/archived/spring-boot-logger-%d{yyyy-MM-dd}.%i.log 10MB property : xml 에서 사용할 변수값 선언 appender : 기능단위 자바로치면 method 격이라고 생각하면됩니다. 위 설정파일에서는 Console이라는 appender에서는 기본적으로 스프링..

Springboot 2023.08.16

Grafana 활용기(Spring Boot)

Grafana 애플리케이션과 연동하는것은 이글에서 다루지 않겠습니다. 그라파나를 쓰면서 느낀점들이나 알게된점들을 정리하는 글 입니다. 남이만든거 잘 가져다 쓰자 https://grafana.com/grafana/dashboards/6756 위 사이트로 들어가면 다음과 같은 id 또는 JSON 파일을 다운로드 받을수 있습니다. id를 복사해서 import로 들어갑니다. JSON파일을 import 해 줘도 되고 사진과같이 아이디 정보를 입력해면 해당 대시보드를 받아서 사용해 볼 수 있을.... 거라 생각했는데 하고있는 프로젝트는 클러스터가 무려 세개~~ 그리고 매트릭정보나 env정보가 맞지않아서 저는 참고 정도만 하고 제가 직접 만들었습니다. newDashboad를 클릭후 대시보드를 선택하면 머리가 하얗게 ..

Springboot 2023.08.16

Springboot + prometheus + grafana모니터링 시스템 구축

Spring boot 설정 의존성 추가 implementation 'org.springframework.boot:spring-boot-starter-actuator:2.7.2' implementation 'io.micrometer:micrometer-registry-prometheus' implementation 'io.micrometer:micrometer-core' yml 설정 management: endpoints: web: exposure: include: - info - health - loggers - mappings - metrics - shutdown - prometheus 위 설정을 해주고 엔트포인트로 /actuator 로 접속되면 application/json+hal 타입에 해당 주소와..

Springboot 2023.08.16

JPA CascadeType 종류와 부모 테이블 삭제

Cascade? Cascade는 사전적의미로 종속, 계산식 폭포 등의 의미를 품고 있다. 이름에서 알수 있듯이 db 관계를 맺고 있는 테이블끼리 cascade를 한다는건 상위 테이블을 삭제하면 관계맺은 하위 테이블 까지 튜플이 같이 삭제된다는 뜻이 된다. PersistentObjectException: detached entity passed to persist 위 에러는 JPA 사용시 자동으로 생성되는 값을 가진 필드에 직접 값을 할당해 저장하고자 할때 발생되는 에러이다. JPA 에서의 Cascade JPA 라는 ORM 에서 Cascade는 다음과 같은 타입과 종류가 있습니다. javax.persistence.CascadeType JPA Cascade Type ALL 상위엔티티에서 하위 엔티티로 모든작..

Springboot 2023.08.16

SpringBoot/한글파일(.hwp) 데이터 바인딩 후 다운로드 하기

제가 하는 프로젝트에서 받은 요구사항이 자동으로 문서를 생성하고 다운로드까지 제공해야하는 요구사항이 있었습니다. 한글 파일에 데이터 바인딩 문서를 생성(다운로드) 위와같은 절차를 거쳐야 하기 때문에 일반적인 static 파일을 view로 보여주는 요구사항과 비슷해보지만 정말 다른 요구사항을 직면하면서 해결해 나가며 배운 내용입니다. 1. 한글파일 .hml 파일로 확장자 변환하기. 한글파일을 뜯어보면 .hml파일로 확장자를 변환해서 vs 같은 ide 툴로 열어보면 xml 구조로 되어있습니다. xml 이라는 점을 이용해서 DOM 에 Element 을 이용해서 직접 바인딩을 해주는방법이 있습니다. (더 좋은방법이 있다면 알려주세요..) 2. 작업하기 쉽게 .hml파일 정렬하기 해당 사이트 추천 (xml 정렬 ..

Springboot 2023.08.16

java 이미지 포맷 변환 / png to jpg

자바에서는 imageIO 클래스를 이용해 이미지를 컨트롤 할 수 있다. 이미지 포맷 변환 프로세스 사용자가 파일 저장 서버단에서 파일 전송 후 png 파일인 경우 파일 포맷을 변경 변환된 jpg 파일 저장 multipartFile 타입 File 타입으로 캐스팅 public static File multipartFileToFile(MultipartFile file) throws IOException { File convFile = new File(file.getOriginalFilename()); convFile.createNewFile(); FileOutputStream fos = new FileOutputStream(convFile); fos.write(file.getBytes()); fos.close..

Springboot 2023.08.16

Spring boot docker image로 배포시 타임존 설정 방법

docker-compose.yml 설정 environment: TZ:Asia/Seoul 해당 설정 추가 Spring boot TZ 설정 java -jar -Duser.timezone=Asia/Seoul app.jar -Duser.timezone=Asia/Seoul 설정 추가 @PostContruct 어노테이션을 사용한 타임존 지정 @SpringBootApplication public class TimeZoneApplication { @PostConstruct void started() { TimeZone.setDefault(TimeZone.getTimeZone("Asia/Seoul")); } public static void main(String[] args) { application.run(TimeZo..

Springboot 2023.08.16

Thread starvation or clock leap detected, Dead Lock, hikari 오류 해결

CPU에 우리 스프링 프로젝트의 Thread들이 올라가서 작업을 하게 되고, 그러다 한 Thread내의 별도 Transaction에서 추가적인 SQL문 실행이 필요해지면서Thread가 Connection을 더 필요로 하는 상황이 생겼다. 우리 스프링 부트 프로젝트에서 Thread가 Connection이 더 필요한 이유는 다음과 같다. 예시 상황 트랜잭션 로그를 확인해보면 Connection이 몇개가 필요한지 계산해 볼 수 있다. 스프링 컨테이너는 트랜잭션 범위의 영속성 컨텍스트 전략을 사용한다고 한다. Service의 메소드가 사용될 때 Service의 트랜잭션이 시작하고, Service의 메소드에서 Repository를 사용할 때 Repository의 트랜잭션이 시작했다. 요청을 처리하는 한 개의 Th..

Springboot 2023.08.16

JPA /save , saveAll 사용시 주의 사항들

JPA saveALl 에서 insert 이전에 select 가 일어난다!! 부제 saveAll 을 잘 모르고 사용하는 문제 한 번에 많은 데이터를 데이터베이스에 저장하려고 할 때 일반적으로 데이터 하나당 insert를 날리는 것보다 값들을 묶어서 batch insert하는 경우가 더 성능이 좋다. 그래서 흔히 사용하는 방법이 SaveAll을 사용하는데 해당 함수의 내부를 잘 모르고 사용하면 insert 쿼리 하나당 select 쿼리가 날라가거나 아니면 bulk_insert를 의도했지만 개별로 insert 쿼리가 날라가고 혹은 의도치 않게 update가 되는 경험을 할 수 있다. Batch Insert batch insert 를 하기위한 사전 설정 yml spring: jpa: properties: hib..

Springboot 2023.08.16