본문 바로가기

Java

SOLID 원칙 SOLID의 다섯가지 원칙은 시간이 지나도 유지보수와 확장이 용이하고, 이해하기 쉽고 유연한 소프트웨어를 만들기 위한 객체 지향 설계 원익의 모음입니다1. Single Responsibility Principle(단일 책임 원칙)클래스는 단 하나의 책임만 가져야 한다. 말 그대로 클래스에는 단 하나만의 책임을 가지고 있도록 설계해야 합니다. 아래와 같이 직원이 정보관리, 급여 계산, 저장, 생성 등 많은 책임을 가지게 설계해서는 안됩니다오케이 이런 규칙이 있다는것은 알겠는데 이런 규칙이 왜 필요할까요?1. 높은 유지보수, 코드의 이해 및 가독성 향상2. 쉬운 테스트와 디버깅3. 연쇄 효과 최소화 (Reduced Coupling): 한 클래스의 변경이 다른 연관된 클래스들의 수정을 유발하는 '폭포 효과(R.. 더보기
결제실패 시 재고 원상복구 시스템 만들어보기 과제에서 요구한 기능을 모두 만들고 추가적으로 만들어보고 싶은 기능이 있어서 만들어보았습니다. 지금 플로우에선1. 고객이 물건을 주문 요청을 합니다.2. 요청 들어온 주문이 실제로 남아있는지 확인합니다.3. 주문을 생성(재고 반영) 을합니다.4, 결제를 진행합니다 이런 플로우를 가지고있는데, 여기서 저는 3번과 4번 순서를 고민을 했었는데, 여기서 만약 3번과 4번 사이에 문제가 발생하여서 뒤에 플로우가 망가진다면, 재고반영의 경우 누락이있다면 내부적으로 처리 할 수 있는 문제이지만, 고객에게 결제는 진행이 되었는데 주문이 생성되지 않아서 누락이된다면, 고객이 컴플레인 하기 전까지 내부적으로 어떤 문제가 있는지 파악 할 수 없을 것입니다.그렇기 때문에 저런 플로우로 프로그램을 설계하였고, 만약 고객이 .. 더보기
[트러블슈팅]java.lang.NullPointerException: Cannot invoke "java.util.List.stream()" because "this.items" is null 커머스 시스템에서 고객의 장바구니에 아이템을 넣는 서비스를 제작중 발생한 이슈에 대해서 작성해보겠습니다.java.lang.NullPointerException: Cannot invoke "java.util.List.stream()" because "this.items" is null 문제확인장바구니에 데이터를 상품의 데이터를 넣으려 하는데 잔여 수 보다 적은값을 입력했음에도, 정상적으로 동작하지 않고NullPointerException 에러가 발생하였습니다.[ 전자 제품 카테고리 ] 원하시는 상품 ID를 입력하세요.상품 ID = 1 | 상품 이름 = Galaxy S25 | 상품 가격 = 1,200,000 | 잔여 갯수 = 100상품 ID = 2 | 상품 이름 = iPhone 16 | 상품 가격 = 1,3.. 더보기
의존성 주입 해보기 (DI) 오늘은 시간이 없어서 간단하게 TIL을 작성 해 보겠습니다. List productList = new ArrayList(); //1. 제품을 하나하나 객체로 만들어서 전체 리스트 객체로 집어넣는다. Product product1 = new Product(1,"Galaxy S25" , 1200000 , "최신 안드로이드 스마트폰" ,100); Product product2 = new Product(2,"iPhone 16" , 1350000 , "Apple의 최신 스마트폰" ,50); Product product3 = new Product(3,"MacBook Pro" , 2400000 , "M3 칩셋이 탑재된 노트북" ,100); Product product4 = new Pr.. 더보기
Java의 record 클래스 타입으로 상세기록 만들기 일단 recode는 자바 14부터 preview기능으로 나왔고 16버전부터 정식으로 들어왔기때문에, 사용하지 못하는 분들도 계실 수 있습니다. 일단 저는 이게 뭔지 궁금해서 한번 사용해보았고 생각보다 쉽고 괜찮은 기능이라 생각해서 적용하고 작성해봅니다.recode가 뭔데?불변(immutable) 데이터 객체를 위한 전용 클래스 문법.예를들어서 이런 클래스가 있다고 가정해봅시다.public class User { private final String name; private final int age; public User(String name, int age) { this.name = name; this.age = age; } public String g.. 더보기
삭제한데이터를 undo 하는 기능 만들기 계산기 기능중 계산결과를 삭제하는 기능이 있습니다.이 삭제된 결과를 어딘가에 저장 해 두었다가 삭제 취소 시 삭제 했던 데이터를 다시 가져오는 기능을 추가해 보고자합니다. private final ArrayList deletedList = new ArrayList();일단 삭제된 데이터들을 저장하는 변수를 하나 만들어줍니다.해당 변수는 외부에서 접근을 못하게 막아야 하고, 다시 set할수 없게 하기위해서 private final키워드를 이용해줬습니다. 따로 새로 add메서드는 만들어주지 않을 것입니다.왜냐하면 기존에 만들어둔 삭제하는 메서드에 제거된 요소를 deletedList에 추가만 해주면 되기때문입니다. 여기서 저 removeFirst 메서드에서 반환해 주는 값을 확인 하기 위해public.. 더보기
제네릭에 extends Number를 해도 사칙연산이 안되는 이유 과제를 수행하다가 제네릭에서 타입에 extends를 걸 수 있다는 사실을 알았습니다.그래서 이전에 제네릭 타입T에 사칙연산을 해줄 수 없어서 형변환을 아래와 같은 방식으로 만들어 주었는데double number1 = Double.parseDouble(positiveNumber1.toString());아그럼이제 그럴 필요 없겠다! 생각을했습니다. 하지만 여전히 "연자사 '+' 를 "T","T"에 적용할 수 없습니다. 라는 에러가 발생하였고, 엥? 똑같이 안되네? 하고 왜 안되는건지 찾아봤습니다. 일단의 진짜 의미는 T는 Number의 하위 타입이다. 즉 T는 아래 중 하나 일 수 있습니다 :Integer Double Long BigDecimal AtomicInteger Byte Short ... 하지만!.. 더보기
이중콜론(::)(매서드 참조)표현식 다른 팀원들과 코드 리뷰 해보던 중 팀원 코드에서 Double::sum이런 식의 코드를 발견하였다. 이게 뭔지 여쭤보니 AI랑 블로그 짬뽕해서 만들어서 정확히 모르겠다 하셔서 이게 뭔지 조금 더 공부를 해보았습니다. 인단 문법은인스턴스명::메서드명위와 같은 표현방식을 이용한다고 합니다.사실 이게 뭐냐면 우리가 람다식을 사용할때(a, b) -> calculate.sum(a, b);이런식으료 표현을 하는데 이를 sum으로 보내는 매개 변수를 이미 이전 결과에서 알고 있고 똑같은 행위가 map이나 forEach등에서 반복적으로 사용될때 사용한다고 합니다. 즉,calculate::sum이런식으로 작성하면 이전에 받은 결과들을 sum함수에 매개변수로 전달을 해준다는 의미 라고 이해했습니다.적용 전 --stream.. 더보기