본문 바로가기

전체 글

(107)
Spring 로그백 RollingFileAppender와 AsyncAppender 차이, logback-spring.xml 설정 예시 이번에 마무리 지어가는 시스템에서 로그 설정 관련 요청이 들어와 로그백의 RollingFileAppender와 AsyncAppender에 대해 정리해보았습니다. 로그백이 뭔가요? 로그백(Logback)은 자바 언어로 작성된 로깅 프레임워크입니다. 로그백에서는 RollingFileAppender와 AsyncAppender 두 가지 로그 기능을 제공합니다. RollingFileAppender RollingFileAppender는 로그 파일을 일정 크기나 기간에 따라 자동으로 분리해서 저장할 수 있는 기능을 제공합니다. 예를 들어, 로그 파일의 크기가 10MB를 넘어가면 새로운 파일을 생성하고 이전 파일에 대한 백업을 생성할 수 있습니다. 이러한 방식으로 로그 파일이 계속해서 늘어나는 것을 방지하고, 필요한 ..
@Param 어노테이션, MyBatis와 Spring Data 헷갈리지 말자 org.springframework.data.repository.query.Param와 org.apache.ibatis.annotations.Param 어노테이션은 서로 다른 패키지에 있으며 다른 용도로 사용됩니다. org.springframework.data.repository.query.Param 어노테이션은 스프링 프레임워크에서 제공하는 Spring Data JPA와 같은 ORM(Object Relational Mapping) 프레임워크에서 사용됩니다. 이 어노테이션은 메소드의 파라미터 이름과 쿼리 매개 변수 이름을 매핑하기 위해 사용됩니다. 예를 들어, 다음과 같은 메소드가 있다고 가정해보겠습니다. @Repository public interface UserRepository extends Jpa..
[데이터베이스/오라클] 대량 insert 속도 개선 요즘 푸시 발송 속도 개선을 하고 있는데, FCM 발송 후 결과 저장이나 잘못된 토큰 삭제 처리에서 병목이 생기는 것을 확인하였다. 그래서 사용자의 푸시 '알림함'에 대량 insert 하는 부분을 개선하고자 오라클 다중 insert 속도를 개선하는 방법을 찾아보았다. ### 기존 INSERT INTO SOME_TABLE (col1, col2 ..) VALUES (#{val1}, #{val2} ..); ### 1차 수정 하나의 commit으로 처리될 수 있도록 묶었다. (참고로 spring + mybatis 사용하여 처리 중) 로컬 디비로 1000건 insert 테스트 시 26초가 나왔다. BEGIN INSERT INTO SOME_TABLE (col1, col2 ..) VALUES (#{val1}, #{v..
[데이터베이스] FK 쓸까, 말까? 오늘 외래키를 삭제한 이유 완성된 프로그램 솔루션을 납품하는 일은 언제나 커스터마이징과의 싸움입니다. 이 부분을 얼마나 줄일수 있냐에 따라 수익성이 달려 있다고 해도 과언이 아닙니다. 아무것도 없는 허허벌판에 공사를 하는 것은 오히려 쉬울 수 있습니다. 하지만 이미 복잡한 시스템과 체계를 갖추어 놓은 고객사에 납품을 할 때는 생각보다 많은 난관에 봉착하게 됩니다. 오늘은 고객사에서 오라클 데이터베이스의 외래키(FK, Foreign Key)를 삭제해달라는 요구를 받아 검토를 해보았습니다. 이유는 마이그레이션 이유인데요, 외래키를 써야하는 경우와 쓸 수 없는 경우에 대해 정리해보았습니다. 관계형 데이터베이스에서 외래키를 쓰는 & 쓰지 않는 경우 데이터베이스에서 외래키(Foreign Key)는 다른 테이블의 기본키(Primary Key..
[오라클] 시퀀스, sysdate 등을 조회할 때 `FOM DUAL`을 쓰는 이유 오라클에서 시퀀스를 사용하거나 sysdate 따위를 조회할 때 FROM DUAL을 씁니다. 이런 식이죠. SELECT sysdate FROM dual; SELECT SOME_SEQUENCE.nextval FROM dual; 오늘은 협력사 기술지원팀의 신입 개발자 분이 이걸 왜 쓰는지 궁금해 하셨는데, 저도 학생 시절 공부할 때부터 무의식적으로 써오던 터라 명확하게 설명해줄 수가 없었습니다. 그래서 궁금해하실 분들을 위해 글로 정리해보았습니다. MySQL이나 Maria 등과 다르게 왜 오라클에서는 FORM DUAL을 요구할까요? 오라클에서 `FORM DUAL`을 사용하는 이유 Oracle에서 시퀀스나 SYSDATE와 같은 단일 값을 반환하는 함수를 조회할 때 "FROM DUAL" 구문을 사용하는 이유는 다..
특정 아이피의 VIP(Virtual IP) 여부를 확인하는 방법 시스템을 유지보수 하고 있는데, 유지보수를 위해 초기에 넘겨 받은 자료들 중에 인프라에 대한 내용이 조금 부실했습니다. 그래서 운용 도중에 VIP와 Real IP를 구분하지 못해서 인프라 팀에 잘못된 정보를 넘겨주는 등의 해프닝이 가끔 있었습니다. 그래서 VIP를 구분하는 방법에 대해 정리해보았습니다. 특정 IP 주소가 VIP (Virtual IP)인지 실제 IP (Real IP)인지 판별하는 방법은 다음과 같습니다. ARP 테이블 확인 VIP 주소는 여러 대의 서버가 공유하므로 ARP 테이블에서 해당 주소를 확인할 수 있습니다. 만약 VIP 주소가 ARP 테이블에 등록되어 있다면 해당 주소는 VIP 주소입니다. 네트워크 트래픽 분석 VIP 주소로 들어온 트래픽을 분석하여 VIP 주소로 접속한 클라이언트..
데이터베이스에 파일을 blob으로 저장하는 방법 파일을 서버 파일시스템에 저장할 것인지 데이터베이스에 저장할 것인지는 대개는 고려대상이 아닙니다. 데이터베이스는 서버 용량에 비해 매우 비싼 자원입니다. 그럼에도 불구하고 다양한 비즈니스 요구사항에 따라서 데이터베이스에 파일을 저장하는 것을 고려해보아야 하는 경우도 있습니다. 오늘은 다른 회사로 이직한 후배가, 이직한 회사에서는 데이터베이스에 Blob으로 파일을 저장한다며, 이렇게 만드는 경우도 있냐고 해서 관련 내용을 정리해보았습니다. 제가 취준생일 때 이런식으로 설계를 해본 경험이 있는데 여러모로 많은 번거로움에 비해 큰 이점은 느끼지 못했던 방법이었습니다. 제가 아직 그런 경우가 필요한 비즈니스 프로세스를 경험해보지 못했을 수도 있습니다. 데이터베이스에 파일을 Blob 저장할 때 장단점 파일을 데이..
[RESTful API] DELETE 요청에 Body를 사용하지 않는 이유 썰 API 서버에서 HMAC 검증을 추가했는데, 게 중에는 DELETE 메소드를 사용하는 API도 있다. 그런데 iOS 개발팀에서 DELETE 요청에 payload를 담을 수 없으니 이 API만 payload 대신 query string으로 생성한 HMAC으로 검증해달라는 요청을 했다. 이유를 들어보니, 그쪽 진영에서 가장 흔하게 사용하는 라이브러리에서는 DELETE 요청에 payload를 담을 수 없다는 것이다. 그래서 어차피 DELETE가 적합하지 않았던 API라 POST로 변경을 해주고, 관련 내용을 좀 찾아보았다. REST API URL 설계 지침 우선 API URL을 설계할 때에는 다음과 같은 지침을 따르는 것이 좋다. URL은 명사 형태로 작성하고, 동사는 HTTP Method로 나타낸다. U..