전체 글 51

백엔드 아키텍처 개요(2) - DIP

지난 글에서 가장 기본적인 계층 구조의 아키텍처 구성에 대해 알아보았습니다. 이번 글에서는 그러한 계층 구조 아키텍처를 사용했을 때의 문제점과 이를 해결하기 위한 DIP(Dependency Inversion Principle) 의존성 역전 원칙을 알아보도록 하겠습니다. 예를 들어 어떠한 도메인의 가격 계산 규칙 기능이 있습니다. 할인 금액 계산 로직이 복잡해지게 되면 객체 지향으로 로직을 구현하는 것보다 룰 엔진을 사용하는 것이 더 알맞을 때가 있습니다. 다음의 예시 코드는 Drools라는 룰 엔진을 사용해서 로직을 수행하는 인프라스트럭처 영역의 코드입니다. public class DroolsRulerEngine { private KieContainer kContainer; public DroolsRul..

Architecture 2023.01.22

[프로그래머스][Java] 크기가 작은 부분 문자열

문제 프로그래머스 - 크기가 작은 부분 문자열 프로그래머스 코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요. programmers.co.kr 풀이 String p 의 길이 length_p 를 저장 문자열 t 에서 len 만큼 잘라서 long 타입으로 저장 (int 는 값이 작아 오류 발생) ❗️for문으로 순회하면서 substring ➡️ 인덱스 넘어가지 않도록 주의 String p를 Long 타입으로 변환 후, 작거나 같으면 answer 값 증가 코드 import java.util.ArrayList; import java.util.List; class Solution { public int solut..

백엔드 아키텍처 개요

대학교 시절과 회사에 입사한지 얼마 되지 않았을 때 까지는 아키텍처의 중요성에 대해 간과했습니다. 그나마 알고 있는 것이라고는 MVC 프레임워크 정도가 전부였습니다. 물론, MVC 프레임워크 역시 아키텍처 영역에서 보기에는 표현영역을 위한 기술 중에 하나일 뿐이지 아키텍처를 대변하지는 않습니다. 회사에서 프로젝트를 진행하면서 DDD 에 관해 접하게 되고 AA(Application Architecture) 분들과 협업을 하게 되면서 아키텍처에 대한 공부 역시 필요하다는 것을 알게 되었습니다. 사실 아키텍처 공부는 정말 끝이 없는 것 같습니다. 정확한 영역이 어디까지인지도 아직 잘 모르겠습니다. 아키텍처를 공부하다 보면 이와 관련된 수많은 다른 영역들을 접하게 됩니다. DIP, infrastructure, ..

Architecture 2023.01.16

[Java] extends 와 implements 의 차이

자바에 있어서 OOP, 상속과 관련되 개념은 매우 중요하다고 할 수 있습니다. 자바 코딩의 핵심이라고 볼 수 있으며 자바 관련 조금만 큰 규모 혹은 작은 규모더라도 SpringBoot 코딩을 하다보면 반드시 사용하게 되는 개념 입니다. 얼마 전 회사에서 하나의 시스템과 다른 시스템을 연동하는 20여개의 api 를 개발할 때도 implements를 이용했습니다. 이 때HttpClient.java 라는 파일에는 public ResponseDto getInformation(); 과 같은 형식으로 개발할 api 들에 대해 나열한 interface를만들고 HttpClientImpl 이라는 구현체를 만들어 구현체에서 각 api 들을 구현했습니다. 이렇게 코딩을 하게 되면 api 의 스펙이 도중에 변경 되더라도 Ht..

Java 2023.01.10

[Java] AtomicInteger 사용하기

오늘은 Java의 AtomicInteger에 대해 정리해보고자 합니다. AtomicInteger는 Java에서 제공하는 클래스로 Java의 멀티스레드 환경에서 숫자 관련 계산을 진행할 때 자원의 동시성 제어를 위해 사용되는 클래스입니다. 이러한 AtomicInteger는 동기화된 int 보다 성능 역시 뛰어나다고 합니다. -- Java의 멀티스레드 환경과 동시성 제어는 여기서 다루기엔 내용이 길어져 따로 정리해보도록 하겠습니다. 이번에 AtomicInteger를 알게 된 계기는 테이블의 데이터를 조회하여 해당 데이터를 정렬 후 점수에 따라 랭크를 부여해야 했습니다. 이때 AtomicInteger 클래스를 사용하여 처리한 팀원의 코드를 보고 찾아보게 되었습니다. 객체 생성 public void atomic..

Java 2023.01.07

String 형태가 아닌 LocalDateTime그대로 받아보자!

Spring을 사용하여 개발 할 경우 Controller에서 요청 과 응답을 주고 받을 때 DTO에서 LocalDate와 LocalDateTime을 사용할 경우가 종종 있습니다. 이때 직렬화를 하지 못해 String으로 받은 후 서비스 레이어에서 혹은 DB에 저장하기 직전에 변환하는 경우가 있습니다. Spring에선 굳이 이럴 필요가 없으니 아래 내용을 토대로 번거로운 과정을 생략해보면 좋을 것 같습니다. 우선적으로 정답을 말씀드리면 @JsonFormat 어노테이션과 @DateTimeForamt을 사용하면 가능합니다. 1. RequestParameter 1-1. @ModelAttribute Controller 코드 @GetMapping("/get") public String get(GetModel get..

BackEnd/SpringBoot 2023.01.01

SpringBoot @Converter @Convert 데이터 처리 시 활용

코딩을 하다보면 java 에서는 CardStatus 와 같은 Card의 현 상태를 Enum을 사용해서 값(ACTIVE, USE, PAUSE)을 다루고 싶고 데이터베이스에는 해당 Status에 따른 표현 값("A", "U", "P")을 저장하고 싶은 경우가 있습니다. java에서의 코딩할때의 표현 값과 DB에 실제 저장되는 값이 다르게 하는 것입니다. public enum CardStatus { ACTIVE("A"), // 발행 USE("U"), // 사용 PAUSE("P"); //사용 정지 private final String value; @JsonValue public String getValue() { return value; } CardStatus(String value) { this.value =..

BackEnd/SpringBoot 2022.12.11

DDD란 무엇인가(2) - 도메인, 서브도메인, 바운디드 컨텍스트 등

DDD의 기본 개념에 대해 알아보았던 DDD란 무엇인가(1) 에 이어서 이번 글에서는 DDD에서 많이 사용하는 용어들에 대한 정리를 해보고자 합니다. 회사 프로젝트에서 타회사 AA(Application Architecture) 분들과 설계 단계에서 대화를 나눌 때 많이 접했던 용어들과 그분들이 설명해주셨던 대로 정리해보고자 합니다. 개인적으로 해당 부분은 개발자들의 영역이기보다는 비즈니스 정책을 정하는 현업분들(또는 기획자)의 의견이 필요한 영역이라고 생각합니다. 도메인 - 도메인은 외국 용어이기도 하고 딱히 해당 용어를 우리말로 번역할 만한 단어가 없는 것 같습니다. 도메인은 우리가 해결하고자 하는 문제 영역이라고 볼 수 있습니다. 그냥 '네이버', '쿠팡' 처럼 서비스 자체를 도메인이라고봐도 됩니다...

BackEnd/DDD 2022.12.04

[JPA] 영속성 연관관계 전이 CASCADE 란?

JPA를 공부하면서 항상 헷갈렸던 부분이라 명확하게 정리를 해보고 넘어가려 합니다. CASCADE - 영속성 연관관계의 전이를 의미합니다. - 부모 엔티티에서 자식 엔티티로 상태를 전이하는 것입니다. ex. 부모 엔티티 저장할 때 자식 엔티티도 함께 저장, 게시글과 첨부파일 - Parent와 Child가 라이프사이클이 동일할 때, Child를 소유하는 Parent가 하나일 때 사용하는 것이 좋습니다. Entity의 상태 Transient : JPA가 모르는 상태 (단순 객체 생성) Persistent : JPA가 관리중인 상태 (1차 캐시, Dirty Checking, Write Behind, ...) Detached : JPA가 더이상 관리하지 않는 상태 Removed : JPA가 관리하긴 하지만 삭제..

BackEnd/JPA 2022.11.13

JPA의 Dirty Checking이란?

Jpa를 활용하여 백엔드 개발을 하다보면 'JPA 영속성 컨텍스트' 혹은 '더티 체킹'이란 말을 종종 들을 수 있습니다. 실제로 얼마전에 회사에서 코드리뷰를 진행하는데 어떤 팀원 분께서 다음과 같이 말씀하셨다. 제가 알기로 JPA는 더티 체킹이라는 걸 해서 변경사항을 감지해 자동으로 update를 해주는 걸로 알고 있는데 왜 한번 더 save를 해줬나요? 이유가 있어요? 그 때 나는 물론 명확하게 답변을 드리지 못했다... 아..? 네..! 그러면 한번 더 save 하지 않고 트랜잭션을 마무리 하도록 하겠습니다. 라고 대충 얼버무렸던 기억이.... 그래서 오늘은 이 Dirty Checking 이라는 것의 개념을 한번 짚고 넘어가려고 합니다. 다음에는 명확히 답변드릴 수 있도록...! 예를 들어 다음과 같..

BackEnd/JPA 2022.11.05