[Java] BiConsumer: 두 개의 매개변수를 처리하는 함수형 인터페이스
·
JAVA
안녕하세요 개발자 stark입니다! 오늘은 BiConsumer에 대해서 소개드리고자 합니다. 어느 날 제 사수님께서 2개의 List를 이중 stream을 돌리며 filter로 특정 조건을 매칭시키면서 값을 세팅하는 방식에서 BiConsumer를 사용하여 값을 세팅하는 방식으로 변경하신 다음 코드의 가독성과 전체적인 성능이 개선된 것을 리뷰해 주셨습니다. 그래서 저도 이 지식을 흡수하고 로직에서 사용해 보고자 BiConsumer에 대한 자료들을 찾아보며 이해하기 위해 많은 노력을 했습니다. 그리고 이제는 어느 정도 이해가 되었다고 느껴져서 조금이지만 정리해 본 것을 공유드리고자 합니다. 항상 새로운 것을 제게 가르쳐주시는 제 사수님께 감사한 마음을 가지며 포스팅을 작성합니다. 시작해 봅시다. Let's g..
[Java] ReentrantLock으로 티켓팅 시스템 동시성 문제 해결하기
·
JAVA
안녕하세요. 개발자 stark입니다! 오늘은 재미있는 주제를 가지고 왔습니다. 바로 인기 아티스트인 지드래곤의 power 콘서트 티켓팅 시스템을 구현하면서 겪을 수 있는 동시성 문제와 그 해결 방법에 대해 이야기해보려고 합니다. (실제로 존재하는 콘서트는 아니며 이런 콘서트가 있다고 상황만 가정해 봤습니다.) 아마 많은 분들이 티켓팅에 도전해 보신 경험이 있으실 텐데요. 인기 공연은 오픈과 동시에 수만 명이 접속합니다. 이런 상황에서 시스템이 제대로 동작하지 않으면 어떤 문제가 발생할까요? 예를 들어, 지드래곤의 power 콘서트는 굉장히 특별한 콘서트라 단 100석만 예약이 가능하다고 가정해 보겠습니다. 이 콘서트를 예매하기 위해 만 명의 사용자가 동시에 접속했습니다. 우리가 흔히 생각할 수 있는 방식..
[Java] Stream vs forEach 데이터 필터링
·
JAVA
안녕하세요. 금요일이라 행복한 개발자 stark입니다!최근 stream에 대한 글을 자주 적고 있습니다. 왜냐하면 제가 실무에서 너무나도 많이 사용하기 때문입니다. 많은 데이터를 조립해서 가공하는 로직을 만들면서 느낀 점들이 굉장히 많다 보니 계속 기본적인 글을 적게 되는 것 같습니다.특히 저희 팀의 직속선배님께서 제가 forEach문을 사용해서 작성한 비즈니스 로직을 보시더니 stream의 anyMatch를 사용해서 코드가 개선되는 모습을 보여주셨습니다.저는 stream에서 이런 다양한 메서드를 지원한다는 것은 알았지만 어째서인지 잘 사용하지 않았고 항상 filter와 findFirst 같은 메서드만으로 모든 필터링을 하고 있었습니다. 그래서 이번 기회에 다양한 필터 방식과 왜 Stream이 forEa..
Java 클래스 상속의 자유도와 주의점
·
JAVA
안녕하세요. 주말이 더 길었으면 하는 개발자 stark입니다! 오늘은 Java에서 클래스 상속을 사용할 때 알면 좋은 기본적인 내용을 정리해보고자 합니다. 저는 실무에서 클래스 상속을 사용할 때마다 "이 클래스는 정말 상속해도 괜찮을까?"라는 고민을 하게 됩니다. 이런 고민을 하는 이유는 상속이 잘못 사용되면 오히려 코드를 더 복잡하게 만들고 유지보수를 어렵게 만들 수 있기 때문입니다. 그렇다면 Java에서는 상속을 어떻게 사용하는 것이 좋을까요? 오늘은 Java가 제공하는 상속의 자유도와, 그로 인해 개발자가 주의해야 할 점들에 대해 알아보도록 하겠습니다. 특히 '기술적으로 가능하다'는 것과 '실제로 해야 한다'는 것의 차이에 대해 이야기해보려 합니다.  클래스 상속의 기본 제한사항Java에서 클래스 ..
Java Stream 제대로 이해하기
·
JAVA
안녕하세요. 개발이 즐거운 stark입니다!이번에는 자바 스트림(stream)의 동작 방식에 대해 소개드리고자 합니다. 스트림(Stream)은 자바 컬렉션의 데이터를 쉽고 간결하게 처리하기 위해 도입된 기능입니다. 이를 통해 컬렉션 데이터를 순차적으로 접근하고 가공할 수 있으며, 더불어 코드의 가독성을 높일 수 있습니다. List, Set과 같은 컬렉션을 처리할 때 반복문 대신 스트림을 사용하면, 코드가 간결하고 직관적으로 변하게 됩니다. 또한 스트림은 데이터 처리 파이프라인으로 이해할 수 있습니다. 스트림에 작성된 각 연산을 통해 데이터가 흐르듯 처리됩니다. 이러한 파이프라인 방식은 다양한 작업(메서드)을 체이닝(Chaining)하여 마치 물줄기가 흐르듯 일련의 작업을 연결해서 처리할 수 있다는 특징을..
전략 패턴(Strategy Pattern)이란?
·
JAVA
전략 패턴을 알아보자 1. 전략 패턴이란?전략 패턴이란?전략 패턴은 알고리즘 군을 정의하고 각각을 캡슐화하여 교환해서 사용할 수 있도록 하는 디자인 패턴이다. 이를 통해 알고리즘을 사용하는 클라이언트 코드에 영향을 주지 않고 알고리즘을 독립적으로 변경할 수 있다. 전략 패턴의 구성 요소Strategy 인터페이스알고리즘을 정의하는 공통 인터페이스다.특정 작업을 수행하기 위한 메서드를 선언한다.Concrete StrategyStrategy 인터페이스를 구현하는 구체적인 알고리즘 클래스다.다양한 알고리즘이나 행동을 구현한다.ContextStrategy 객체를 가지고 있으며, 클라이언트로부터 요청을 받아 Strategy에 작업을 위임한다.전략을 설정하고 실행하는 역할을 한다.전략 패턴의 작동 방식클라이언트가 C..
커맨드 패턴(Command Pattern)이란?
·
JAVA
Command 패턴 알아보기 1. Command 패턴이 왜 필요하고 어떤 장점을 제공할까?지금부터 레스토랑 주문 시스템을 예로 들어, Command 패턴이 왜 필요하고 어떤 장점을 제공하는지 알아보자.  Command 패턴을 사용하지 않은 경우먼저, Command 패턴을 사용하지 않고 간단한 주문 시스템을 구현해 보자.// OrderSystem 클래스: 주문 처리 담당public class OrderSystem { public void placeOrder(String item) { System.out.println(item + " 주문이 접수되었습니다."); } public void cancelOrder(String item) { System.out.println..
[Java] List를 Optional로 처리할 때 고려해야 할 사항
·
JAVA
Optional에 List를 담았을 때 착각할 수 있는 점이 있다.📌 서론개발 작업을 하던 도중 외부 api를 호출하여 받은 응답 객체(DTO) 내부의 List 필드를 가져다 사용하는 경우가 있었다. 이때 NPE가 생기지 않도록 하기 위해 Optional로 List 필드를 한번 감싸게 되는 상황이 있었다. 이게 선호되는 방법은 아니지만 NPE를 방지하고자 로직을 이렇게 작성하게 되었다. 문제는 내가 착각을 해서 Optional로 감싼 리스트가 빈 리스트(Empty List) 일 때도 ifPresentOrElse() 메서드의 else에 잡힌다고 생각했다. 근데 빈 리스트는 null이 아니기 때문에 orElse에 잡히지 않는다. 그래서 로직을 또 바꾸게 되는 일이 생겼다. 바보 같은 실수일 수도 있지만 충..