728x90
반응형
SMALL

분류 전체보기 220

Strategy Pattern

템플릿 메서드 패턴에 이어 '전략 패턴(Strategy Pattern)'에 대해 공부한 것을 정리하고자 한다. 이 또한 공통 부분을 한 곳에 묶어 중복 코드를 제거하고 변경되는 부분만을 유틸리티성을 부여하여 그때그때 필요한 내용을 채워넣을 수 있게 해주는 패턴이라고 보면 된다. 전략 패턴이란 말이 좀 한번에 와닿지 않을 수 있는데 내가 이해한 전략이란건 이 공통 로직을 제외한 변경되는 로직을 처리하는 그 방법을 말한다. 즉, 이 변경되는 로직을 전략이라 말하고 그 전략을 전달받아 실행하는 코드가 있는 것이라고 생각하면 된다. 말보다 코드 한 줄이 더 와닿기 때문에 바로 코드로 넘어가보자. package com.example.advanced.trace.strategy.code.strategy; public..

Spring Advanced 2023.12.12

Template Method Pattern

자바의 패턴 중 하나인 템플릿 메서드 패턴에 대해서 공부한 것을 작성해 보고자한다. 템플릿 메서드 패턴은 다형성을 이용하여 공통 부분을 하나로 정의하고 변하는 부분만을 유연하게 변경하게 하는 방법이다. 예를 들어, 모든 메서드에 대해 시작 시간과 종료 시간을 구해 메서드 실행 시간을 보여주는 로그를 모든 메서드에 적용하고 싶다면 어떻게 하면 될까? 방법은 많겠지만 템플릿 메서드 패턴이 그 중에 하나가 될 수 있다. 위 상황에서 모든 메서드에 대해 공통 부분은 무엇인가? 바로 메서드의 시작 시간과 종료 시간을 구해 소요시간을 구해내는 부분이다. 변하는 부분은 무엇인가? 각 메서드가 가지고 있는 비즈니스 로직이다. 이 모든 공통 부분에 대해 모든 메서드에 각각 적용한다면 적용하는 것도 일이겠지만 추후 요구사..

Design Pattern 2023.12.12

ThreadLocal을 이용해 동시성 문제 해결하기

개발하다보면 빈번하게 겪는 문제인 '동시성 문제'가 있다. JAVA에서 동시성 문제가 발생하기 위해서는 다음과 같은 조건이 필요하다. 동시성 문제가 발생할 수 있는 환경 지역 변수가 아닌 전역 변수 또는 클래스 멤버(변수) 읽기 작업만 일어나는 게 아니라 쓰기 작업이 가해지는 변수 다음 코드로 동시성 문제에 대한 예시를 살펴보자. FieldService.java package com.example.advanced.trace.threadlocal.code; import lombok.extern.slf4j.Slf4j; @Slf4j public class FieldService { private String nameStore; public String logic(String name) { log.info("저..

Spring Advanced 2023.12.12

선언적 트랜잭션(@Transactional) 내부 호출 주의

스프링과 데이터베이스를 사용할 때 @Transactional 애노테이션을 사용해서 트랜잭션을 시작하고 종료하는데, 이 @Transactional 애노테이션을 사용하는 것을 '선언적 트랜잭션'이라고 한다. 근데 이 선언적 트랜잭션을 사용할 때 주의할 점이 있다. 그리고 이 주의사항은 너무너무너무 중요하다! 트랜잭션 프록시 객체우선 @Transactional이 달려있는 클래스 또는 메소드를 스프링이 실행할 때 쭉 돌면서 찾는다. 찾으면 클래스 단위로 빈을 등록하는데 이 때, 등록되는 것은 실제 해당 객체가 아닌 '프록시'이다. 아래 그림을 보자. 위 그림처럼 실제 Service에 @Transactional 애노테이션이 클래스 단위로 붙든, 특정 메소드에 붙든 있기만 하면 해당 클래스를 프록시로 만든다. 그..

Spring + DB 2023.12.07

MyBatis

이번에는 MyBatis라는 기술을 이용해서 Spring에서 Database와 통신하는 법을 알아보자. 이 역시 나는 사용하지 않을것 같다. 왜냐하면 이 MyBatis를 사용하기엔 Querydsl과 Spring Data JPA가 너무 강력하기 때문이다. 그래도 공부를 한 이유는 왜 이 MyBatis가 게임체인저가 되지 못하고 JPA, Querydsl이 나왔을까?에 초점을 두었다. 이전 포스팅인 JdbcTemplate은 다 좋은데 동적 쿼리를 만들어내기가 쉽지만은 않았다. https://cwchoiit.tistory.com/71 JdbcTemplate Spring과 데이터베이스를 연동할 때 사용되는 기술 중 빠지지 않고 잘 사용되는 기술인 JdbcTemplate을 사용하는 법을 정리하고자 한다. 우선, Jd..

Spring + DB 2023.12.06

JdbcTemplate

Spring과 데이터베이스를 연동할 때 사용되는 기술 중 빠지지 않고 잘 사용되는 기술인 JdbcTemplate을 사용하는 법을 정리하고자 한다. 우선, JdbcTemplate은 기존 JDBC 기술을 직접 사용할 때 겪는 문제들을 해결해 준다. 예를 들면 트랜잭션을 시작하고 종료하는 코드 작성이나 반복적인 커넥션 후처리와 같은 것들. 나는 개인적으로는 JdbcTemplate을 사용하지 않고 Spring Data JPA와 Querydsl을 같이 사용하는 방식을 선호한다. 그러나, 이 JdbcTemplate은 알아둘 만한 가치가 있다고 생각해서 기록하고자 한다. 라이브러리 다운로드 우선, JdbcTemplate 라이브러리를 받아야 한다. build.gradle //JdbcTemplate implementa..

Spring + DB 2023.12.06

PostgreSQL 선택적 외부 접근 허용

Spring Boot + Spring Data JPA + Hibernate + PostgreSQL + Docker를 이용해서 프로젝트를 진행하고 있는데, 지속적으로 내 데이터베이스가 사라지는 현상이 나타났다. 처음에는 원인을 DB 과부하라고 생각했어서 쿼리 튜닝부터 커넥션 수 변경, 커넥션 지속 시간 변경, 커넥션 타임아웃 시간 변경, 간헐적으로 시간이 오래 걸릴 가능성이 있는 서비스 로직과 트랜잭션 분리 등 정말 갖가지 방법을 동원해서 유지보수를 진행했는데도 터진다.. 데이터베이스가 그렇다고 무거운것도 아니다.. 기껏해봐야 데이터베이스 덤프 사이즈는255.4K.. 아무래도 이건 다른 원인이 있을까 싶어 구글링부터 ChatGPT, Postgresql 매뉴얼까지 검토를 했는데 한가지 의심가는 문구를 봤..

Troubleshooting 2023.12.05

예외2

https://cwchoiit.tistory.com/68 예외 자바에서 예외는 크게 두 가지(체크 예외, 언체크 예외)로 나뉘어진다. 체크 예외 컴파일러가 체크하는 예외이다. 체크 예외는 잡아서 처리하거나 또는 밖으로 던지도록 선언해야한다. 그렇지 cwchoiit.tistory.com 이전 포스팅인 1편에서 기본적인 예외의 내용을 알아보았고 이제는 스프링과 관련된 내용을 작성하고자 한다. 만약, 데이터 접근 시 에러가 발생했을 때 그 에러를 복구하거나 플랜B로 처리하고 싶다면 어떻게 할까? 예를 들어, 새로운 데이터를 데이터베이스에 생성하고자 하는데 새로운 데이터의 기본키가 이미 존재한다면 어떻게 하면 좋을까? 프로젝트나 비즈니스마다 다르겠지만 이런 경우도 있을것이다. 새로운 값으로 또는 다른 값으로 대..

예외

자바에서 예외는 크게 두 가지(체크 예외, 언체크 예외)로 나뉘어진다. 체크 예외 컴파일러가 체크하는 예외이다. 체크 예외는 잡아서 처리하거나 또는 밖으로 던지도록 선언해야한다. 그렇지 않으면 컴파일 오류가 발생한다. 언체크 예외 컴파일러가 체크하지 않는 예외이며, 런타임 예외라고도 불린다. 언체크 예외와 체크 예외의 차이가 있다면 예외를 던지는 throws를 선언하지 않고 생략할 수 있다. 이 경우에 자동으로 예외를 던진다. 예외 계층 예외 계층 구조를 그림으로 보자. 예외 역시 객체이므로 최상위 부모인 Object가 예외 객체의 부모가 된다. Throwable은 예외의 최상위 객체이다. 그리고 이 Throwable 객체의 하위에는 Exception과 Error가 있다. Error: 메모리 부족이나 심..

Spring Application Architecture

스프링 공부를 하면서 가장 자주 사용되며 단순한 그렇지만 중요한 구조에 대해 알아보려 한다. 그냥 내가 공부하고 코드를 작성할 때 유의하며 작성하면 더 좋은 구조가 될 것 같아 스스로 학습하기 위해 작성한다. 가장 단순한 구조는 역할에 따라 3가지 계층으로 나누는 것이다. 프레젠테이션 계층 UI 관련 처리 담당 웹 요청과 응답 사용자 요청을 검증 주 사용 기술: 서블릿과 HTTP같은 웹 기술, 스프링 MVC 서비스 계층 비즈니스 로직을 담당 주 사용 기술: 가급적 특정 기술에 의존하지 않고, 순수 자바 코드로 작성 데이터 접근 계층 실제 데이터베이스에 접근하는 코드 주 사용 기술: JDBC, JPA, Redis, Mongo,... 순수한 서비스 계층이란? 서비스 계층은 가급적 특정 기술을 의존하지 말아야..

728x90
반응형
LIST