JaeWon's Devlog
article thumbnail
[Spring] Spring Batch JobParameter 활용 하기(With. Custom 하기, 공통 관리하기)
BackEnd/Spring 2023. 10. 27. 15:34

최근에 회사에서 스프링배치를 사용하는 배치업무를 담당하고 있습니다. 간략하게 JobParameter를 수정할 내용이 있었는데 이를 추가할 때마다 모든 배치 소스를 수정해야 하는 불편함을 알게 되었습니다.(아래 적용하려다가 괜히 일이 커지긴 했다...) 해당 글에서는 이 JobParameter 를 조금 더 활용하는 법과 별도의 클래스(Class)로 만들어 공통으로 관리하고 빈(Bean)으로 등록해서 사용하는 것을 포스팅해보려고 합니다. 해당 글에서 사용된 소스는 Git 에서 확인하실 수 있습니다. 1. 기존 방식 - 기존에서는 JobParameter 를 사용하기 위해 아래와 같은 형태로 작성하였습니다. 1-1. 샘플코드 @Slf4j @Configuration @RequiredArgsConstructor p..

article thumbnail
[MySQL] Clustered Index와 Secondary Index 정리
BackEnd/DataBase 2023. 10. 4. 20:37

1. 인덱스(Index) 1-1. 인덱스란? - 데이터를 좀 더 빠르게 찾을 수 있도록 해주는 도구 조금 더 자세히 설명하자면, Disk에서 발생하는 I/O 시간은 Main Memory 에서 발생하는 I/O에 비해 매우 크다. 인덱스를 설정함으로서 DB의 데이터를 검색시 Diks 의 I/O가 빈번히 일어나지 않도록 하는 것이다. - 속성 값을 기준으로 이미 정렬되어 있으며, 그에 해당하는 레코드 주소가 있어 빠르게 데이터 접근이 가능 - 인덱스 검색을 위한 조건은 WHERE 절에 인덱스로 설정된 컬럼명이 나와야 함 1-2. 장/단점 장점 - 검색 속도가 빨라진다. -> (무조건 그런 것은 아니다.) : 인덱싱보다 전체 테이블 검색(Full Scan)이 더 나은 경우 - 적은 처리량으로 결과를 얻을 수 있..

article thumbnail
[JAVA] JAXB(Marshalling, UnMarshalling) 사용하기(Feat. XML 파싱)
BackEnd/Java 2023. 8. 16. 13:37

1. JAXB(Java Architecture for XML Binding) - JAXB는 Java Object 를 XML 로 직렬화 해주거나, XML 을 Java Object 로 역직렬화 해주는 Java API 입니다. 마샬링(Marshalling) : Java Object -> XML 언마샬링(UnMarshalling) : XML -> Java Object - 기본적으로 JDK6 ~ 9 버전에는 JAXB 가 내장되어 있어 라이브러리를 따로 추가할 필요가 없습니다.(JDK 11 부터는 Dependency 추가가 필요합니다) - 최근 Object 는 관련해서는 대부분 JSON(JavaScript Object Notation)을 많이 사용하지만, XML 도 종종 사용되고 있습니다. - JSON 을 다룰 때..

article thumbnail
[Spring] @Transactional 사용 시 주의할 점(Feat. 오픈전 발견한 장애)
BackEnd/Spring 2023. 8. 13. 17:05

회사에서 신규 서비스 오픈을 앞에 두고 반영 이후 운영 CBT 를 진행하다가, 오류로그가 계속 올라오는 것을 확인하였습니다. 에러 로그를 확인해보니 하나의 로직에서 DB에 Insert(저장) 후에 해당 값을 Select(조회) 하는 과정에서 발생하였습니다. 발생한 이유를 확인해보니 테스트 환경에서는 발견이 안되었는데, 운영 환경은 모두 이중화가 되면서 발생하였다. 로직은 @Transactional 어노테이션으로 트랜잭션을 걸어두었으나 트랜잭션이 끝나기 전에 Insert(저장)은 1번 Session 으로, Select(조회)는 2번 Session 으로 동작 후 Insert하면서 NPE가 발생하고 있었습니다. 위와 같은 에러가 발생했다는 것은 @Transactional 어노테이션이 제대로 동작을 안했다는 것..

article thumbnail
[Java] Enum 사용 시 비교는 == 일까 equals 일까
BackEnd/Java 2023. 7. 2. 17:11

최근에 회사 동료가 코드 검사를 하겠다며 내가 작성한 코드를 보고 리뷰를 했다. 그러던 중 공통 상수로 선언한 클래스와 Enum 클래스를 사용한 것에 대해 이야기를 하였는데, Enum 을 사용하는데 왜 == 로 비교하지 않고, equals 메소드를 사용해서 비교하는가에 대해 이야기를 하게 되었다. 이 문제에 대해서 간단하게 고민해보고 생각한 것을 포스팅해보려고 한다. 1. 코드 상황 - 간단하게 구현된 코드 상태를 작성해보자면 아래와 같습니다.(이해를 돕기 위한 예제 코드입니다.) Controller @RestController public class MemberController { @PostMapping("") public String memberTest(@RequestBody RequestMembe..

article thumbnail
[Spring] e.printStackTrace() 지양하기(Feat. getStackTrace 사용)
BackEnd/Spring 2023. 6. 28. 16:02

Spring 에서 개발을 하면서 예외가 발생되면 @ControllerAdvice 가 선언된 클래스가 동작하여 알맞은 예외타입(RuntimeException, NullPointerException 등)에 메소드가 호출된다. 대부분 프로젝트마다 로깅하는 방법이 정해져있기 때문에, 거의 사용되지는 않겠지만 빠르게 개발하면서 나중에 변경해야지 하고 e.printStackTrace() 로 작성하는 경우가 있다.(작성자 본인이 그렇다...) 전체 에러 메세지는 보기는 싫고, 실제 예외가 발생된 부분(소스 위치)만 로깅하고 싶었는데 구글링해보니 똑같이 생각하신 분이 계셔서 참고하게 되었다.) 이번 글에서는 e.printStackTrace를 말고 getStackTrace 로 간단한 코드를 통해서 확인해보려 한다. 1...

article thumbnail
[Java] Lambda(람다) 사용 시 지역변수 사용하기(With. effectively final)
BackEnd/Java 2022. 12. 25. 10:40

Java 에서 Lambda 를 사용하면서 개발하던 도중 아래 에러 메시지를 보여주면서 빨간 줄이 그어져 있었다. Variable is accessed from within inner class needs to be final or effectively final 대충 직역해보면 "내부클래스(Inner Class)안에 있는 변수에 접근할 때는 그 값이 final 이나 effectively final 형태여야 한다." 이다. 원하던 로직은 Stream 을 사용해서 어떠한 값이 있는 경우 카운트를 하고 싶었다. 이 과정에서 지역변수(cnt)를 람다안에서 사용하고자 하니 위 에러가 발생하였다. int cnt = 0; memberList.stream().forEach(test -> { if(test.getTeam..

article thumbnail
[Spring] MyBatis 사용 시 resultType 에 InnerClass 사용하기
BackEnd/Spring 2022. 12. 10. 10:50

종종 Spring + MyBatis 개발을 하던 도중에 ResultMap 또는 ResultType 에 InnerClass 로 선언하고자 하는 경우가 있다. 1. 파일 구성 - 간단하게 예제를 통해서 진행해보겠습니다. - ResultType 에서 사용하고자 하는 파일은 아래와 같습니다.(Response 를 사용) 실제 개발에서는 DB의 값을 그대로 전달하는 것은 좋은 방법이 아니지만, 간단한 테스트를 위해서 바로 사용하였습니다. public class TodoDto { @Builder @AllArgsConstructor @NoArgsConstructor public static class Request { private String item; private boolean completed; } @Data ..

article thumbnail
[DB] MySQL/MariaDB Pivot(피벗) 테이블 사용/만들기
BackEnd/DataBase 2022. 12. 1. 08:54

DB를 조회할 때 종종 행과 열이 바뀌어서 조회가 필요한 경우가 있습니다. RDB(관계형 DB)는 행과 열로 이루어져 있는데, 이 위치를 뒤바꾸는 것을 피벗(Pivot)이라고 합니다. Oracle 11g 에서는 해당 기능을 오라클에서 제공하지만, MySQL/MariaDB 는 따로 제공을 하지 않습니다. 해당 글에서는 MySQL/MariaDB 에서 피벗 형식으로 조회가 되도록 간단하게 예제를 진행해보도록 하겠습니다. 0. 테이블 - 현재 테이블의 구조 및 데이터는 다음과 같습니다. student_table department_table 1. Pivot 사용 전 - 두 테이블을 조인하여 연도별, 학과별 입학 인원을 조회하려고 합니다. - 학과에 입학인원이 없더라도, 0명으로 조회되어야 때문에 Outer Jo..

article thumbnail
[SpringBoot] CouchBase 연동하기
BackEnd/Spring 2022. 11. 27. 16:05

이전 글에서 NoSQL 을 로컬환경에 설치하는 것을 알아보았고, 해당 글에서는 SpringBoot 에서 CouchBase 를 연동해서 간단하게 테스트를 진행해보고자 합니다. 1. 환경 세팅 1-1. build.gradle - CouchBase dependency 를 추가해줍니다. implementation 'org.springframework.boot:spring-boot-starter-data-couchbase' 1-2. CouchBase 실행(Mac) - 이전 글에서 Docker 를 통해 설치한 CouchBase 를 실행합니다. docker run -d --name db -p 8091-8094:8091-8094 -p 11210:11210 couchbase:community-7.1.1 - 만약 위 명령..