이전에 람다(Lambda)를 정리하면서 Java 1.8 부터 제공하는 람다를 활용하는 스트림(Stream) API에 대해서도 정리하고자 합니다. 기존의 Java 에서는 Collection 데이터(List, Map 등)를 처리할 때 for, while 문 등 특정 조건에 따라 요소 하나씩을 꺼내어 처리하면서 복잡한 과정을 거쳐야 했습니다. 아직도 람다 방식이 익숙치 않고 스트림 API도 종종 사용하지만 올바르게 활용하지는 못하고 있는 것 같아 정리하여 기록해보고자 합니다. 1. Stream 이란? - 데이터를 추상화하고, 처리하는데 자주 사용되는 함수들을 정의한다. 데이터 추상화 : 데이터의 종류에 상관 없이 같은 방식으로 데이터를 처리 - 데이터의 흐름 -> 배열 또는 컬렉션에 함수 여러 개를 조합해서 ..
회사에서 업무를 할당받게 되면서 Spring Batch 를 사용하고 있는 배치서버를 맡게 되었습니다.(Spring Batch 에 대해서는 추후 포스팅하기위해, 공부하고 정리하고 있습니다...) 그전에 간단하게 스프링에서 @Scheduled 어노테이션을 사용하여 간단하게 스케줄링 하는 것을 정리해보고자 합니다. 1. Spring Schedule(스케줄) 설정하기 - 간단하게 스프링부트(SpringBoot)에서 스케줄 설정은 아래와 같이 할 수 있습니다. @SpringBootApplication @EnableScheduling public class TestApplication { public static void main(String[] args) { SpringApplication.run(TestAppl..
회사에서 코드를 분석하다가 외부 API 통신 시 사용하고 있는 WebClient 를 발견할 수 있었다. Spring 5 부터 제공하는 기능이였고, 이전에는 RestTemplate 를 사용하고 있었어서 WebClient 에 대해 알아보고 정리해보고자 한다. 1. WebClient 란? - Spring 5 부터 제공하는 RestTemplate 를 대체하는 웹 클라이언트(HTTP Client). - 웹으로 API를 호출하기 위해 사용되는 Http Client 모듈 중 하나. - 기존의 동기(Sync) API 를 제공할 뿐만 아니라, 논블로킹(Non-Blocking) 및 비동기(Async) 방식을 지원해서 효율적인 통신이 가능. - 요청을 나타내고 전송하게 해주는 빌더(Builder) 방식의 인터페이스를 사용...
회사에서 소스를 분석하면서 로그를 기록하는 것에 MDC 라는 것을 사용하고 있었다. (새로운 회사에서 소스 분석하면서 모든게 새롭다... 기존에 내가 사용하던 것들은 어디에...) 간단하게 구글링해보니, 멀티쓰레드 환경에서 스레드 별로 ID를 할당시켜 로깅 추적할 때 원활하게 제공해주는 것이라고 한다고 하는데 이를 정리해보고자 한다. 1. MDC(Mapped Diagnostic Context)란? - Map 형식을 이용하여 클라이언트 특징적인 데이터를 저장하기 위한 메커니즘. - slf4j,logback,log4j2 등 Logger(로거)에서 MDC를 제공한다. - MDC 는 key/value 저장소를 지원하며, 이 저장소는 ThreadContext 에 의존한다. - MDC 클래스는 Map 안에 저장된 ..
이전 글에서 JPA에 대한 기본 정리를 진행해보았습니다. 이번 글에서는 JPA 에서 가장 중요할 수 있는 영속성 컨텍스트(Persistence Context)에 대해서 정리해보고자 합니다. 1. 영속성 컨텍스트란? - 엔티티(Entity)를 영구 저장하는 환경. - 어플리케이션과 데이터베이스 사이에서 객체를 보관하는 가상의 저장소 같은 역할. - 엔티티 매니저(EntityManager)를 통해 영속성 컨텍스트에 접근. - EntityManager 를 통해 Entity 를 저장, 조회하면 EntityManager 는 영속성 컨텍스트에 해당 Entity 를 보관하고 관리. 2. 영속성 컨텍스트 생명주기 - 영속성 컨텍스트의 생명주기는 아래 이미지와 같이 4가지 상태가 있다. 비영속(new) : 영속성 컨텍스..
API 통신을 하다 보면 대부분 JSON 형태로 데이터를 주고받는다. 이때, 서로 파라미터 작성 방식(카멜케이스,스네이크케이스) 또는 파라미터 명이 다를 경우 데이터를 파싱 하는 도중에 에러 또는 원활하게 파싱이 되지 않는 경우가 있다. 0. 카멜 케이스, 스네이크 케이스 - 카멜 케이스(Camel Case) 첫 글자는 소문자로, 중간 글자들은 대문자로 시작하는 표기법 ex) memberId, memberName, memberPhoneNumber - 스네이크 케이스(Snake Case) 첫 글자는 소문자로, 중간 글자들은 언더바(_)가 포함되는 표기법 ex) member_id, member_name, member_phone_number 1. 코드 - 간단하게 Json 형태로 Request 를 전달받는 코..
개발을 배우면서 처음 Java에서 DB 와 관련된 작업을 할 때는 JDBC API를 배웠습니다. JDBC API는 항상 모든 로직 안에서 Connection 객체를 받아오고, SQL 문을 작성하고, 끝나면 close 시켜야 했습니다. 그리고 이러한 중복되고 불필요한 코드를 작성하는 것을 보완해주는 MyBatis, Spring JdbcTemplate 를 배워 사용하였습니다. 최근에는 ORM 기술을 통해 SQL 작성없이 객체를 DB에 직접 저장/관리를 할 수 있게 도와주는 JPA 를 사용하여 DB 작업을 대부분 사용하고 있습니다. 이번 글에서는 이 JPA에 대해서 정리를 해보고자 합니다. 0. ORM(Ojbect-Relational Mapping) 이란? - JPA에 대해서 알기전에 기본이 되는 ORM에 대..
DB(MySQL)에서 DELETE 문 에서 Join 을 사용하여 여러 테이블에서 데이터를 삭제하는 방법을 정리해보고자 한다. 1. 일반적인 DELETE 문 --1. 기본 Delete DELETE FROM T_MEMBER; --2. where 문을 사용한 Delete DELETE FROM T_MEMBER WHERE NAME = '개발자'; 2. Join 을 사용한 DELETE 문 - Join 을 사용하여 Delete 를 할 경우 하나의 쿼리로 다수의 테이블에 있는 데이터를 삭제할 수 있다. 2-1. Inner Join - INNER JOIN 과 함께 DELETE 문을 실행하면 기준이 되는 테이블에서 행을 삭제하고, 다른 테이블에서 일치하는 행을 추가로 삭제할 수 있다. - 예를 들어, T1, T2 두 테이..
회사에서 소스를 분석하는 도중에 의존성 주입을 필드에 @Autowired 어노테이션을 사용하지 않고, 생성자를 생성하여 주입하고 있었다. 그리고 종종 생성자에는 아예 @Autowired 어노테이션도 사용되지 않고 @RequiredArgsConstructor을 사용하고 있었다. 항상 필드 주입으로 사용하고 있었어서, 궁금해서 시니어 분께 여쭤보니 @Autowired는 deprecated 돼가는 분위기이고, 또한 생성자 주입을 권고하고 있기도 하다는 답변을 받았다. 추가로, 인텔리제이에서도 Autowired 어노테이션을 사용하면 아래와 같이 경고메시지를 보여주고 있었다.(매번 자세히 확인도 안 하고 넘어갔는데...) 대충 번역해보자면 "필드 주입은 권장하지 않습니다. 항상 빈에서 생성자 기반으로 종속성을 주..
최근에 함수형 프로그래밍을 많이 사용하게 되면서, Java 에서도 1.8 버전부터 함수형 방식의 람다(Lambda) 형식을 제공하고 있다. 또한, Java 프로그래밍 중 종종 사용하는 Stream 연산에서도 매개변수로 함수형 인터페이스를 받도록 되어있고, 람다식은 반환값으로 함수형 인터페이스를 반환한다. 이렇게 점점 Lambda 를 자주 접하게 되어 이를 한번 정리하고자 한다. 1. 람다(Lambda)식이란? - 람다식(Lambda Expression)이란 함수를 하나의 식(Expression)으로 표현한 것. - 함수를 람다식으로 표현하면 메소드의 이름이 필요 없기 때문에, 람다식은 익명 함수(Anonymous Function)의 한 종류. (함수이지만 함수를 따로 만들지 않과, 코드한줄에 함수를 써서..