Spring

Spring

SpringBoot Master/Slave DB 세팅 2

지난번 포스팅에서는 Master/Slave DB를 사용하기 위해 어떻게 세팅을 하는지에 대해 다뤘다. 이러한 세팅을 적용하면서 궁금증이 생겼다. 세팅을 하기 위해 자료를 찾은 것과 그동안 공부했던 것들을 바탕으로 대충은 어떻게 동작하는지는 알게되었으나 더 자세히 알고 싶어졌다. 그래서 이번 글에서는 이 세팅이 어떻게 동작하는지 알아보기위해 코드를 훑어보는 시간을 가져보려고 한다. 개인 공부 용으로 남겨 놓는거라 복잡합니다. 핵심 부분은 LazyConnectionDataSourceProxy에 있으니 그 부분만 보시는 것을 추천합니다. 실행할 로직은 간단한 조회 API 입니다. @RestController public class AppApi { private final AppService appService..

Spring

SpringBoot Master/Slave DB 세팅

SpringBoot Master/Slave DB 세팅 기존에 DB 를 하나만 사용하던 스프링 부트(버전 2.7.12) 프로젝트가 있다. 이 어플리케이션의 DB 세팅은 아래와 같이 application.properties 에 하나의 DB만 세팅 되어 있다. spring.datasource.url=IP spring.datasource.driver-class-name=org.mariadb.jdbc.Driver spring.datasource.username=계정 spring.datasource.password=비밀번호 spring.datasource.hikari.pool-name=풀이름 기타등등 hikari connection pool 세팅 이렇게 세팅을 해주면 스프링에서 알아서 데이터 소스를 만들어주고 사용..

Spring

OAS 사용해 API 문서 작성하기

지금까지는 주로 spring-restdocs 를 이용해 API 를 문서화 했습니다. spring-restdocs 를 사용한 이유는 아래와 같은 이유로 사용을 했습니다. 테스트 코드를 기반으로 작성, 테스트를 통과해야 문서를 만들 수 있으니 문서에 신뢰성이 생깁니다 프로덕션 코드에 문서화를 위한 코드를 추가할 필요가 없습니다 Swagger 는 문서화를 위한 코드를 추가해줘야 합니다 이러한 이유로 restdocs 를 사용했지만 문제가 있었습니다. 바로 문서를 보기 싫다는것! (제 기준으로는...ㅎㅎ) 기껏 신경써서 문서를 만들었지만 화면에 보이는 것은 칙칙한 API 문서… 조치가 필요했습니다. 그래서 Swagger 사용을 고려해봤으나 코드에 api 문서 관련 코드를 넣고 싶지 않아 사용하지 않았습니다. 자료..

Spring

Resilience4jFeign Java Record 문제

Resilience4jFeign 을 사용해 Content-Type 이 x-www-form-urlencoded 인 API 를 호출할 때 요청 객체를 Record 로 선언하면 발생하는 문제입니다. 결제 시스템을 구현하던 중에 발생한 이슈입니다. 새 결제 시스템 프로젝트 구성은 아래와 같습니다. Java 17 Spring boot 2.7.9 resilience4j-feign 2.0.2 feign-(core,okhttp,jackson,slf4j) 12.2 feign-form 3.8.0 위와 같은 환경을 구성해 카카오페이 결제준비 API 를 호출할 때 발생한 이슈에 대해서 기록해 놓으려고 합니다. 회사 프로젝트를 올릴 순 없어 해당 이슈 기록을 위한 작은 프로젝트를 하나 만들었습니다. 아래 코드는 이슈를 설명하기..

Spring

Tomcat 실행시 스프링 내부 동작과정

Tomcat 실행시 스프링 내부 동작과정에 대해 설명해볼게요 Tomcat 실행했을 때 일어나는 동작 톰캣 실행전에 web.xml에 으로 전역 파라미터를 설정해요. 파라미터 이름은 contextConfigLocation이고 어떤 객체들을 미리 만들어 놓을지가 작성된 설정파일의 경로를 적어놔요. 톰캣이 실행되면 클래스(리스너)의 이름을 같은 web.xml에 작성해요. 톰캣을 실행하면 가 등록되어 있는 ContextLoaderListener 객체를 호출하는데 이 객체는 내부적으로 부모객체를 실행해요. 부모객체는 ContextLoaderListener이며, 이 객체에서 Root ApplicationContext를 생성하고 웹과 관련이 없는 객체를 저장해요.(ex: dao) Root ApplicationConte..

Spring

Thymeleaf LocalDate 사용법

Thymeleaf LocalDateTime 사용법에 대해서 알아볼게요. Thymeleaf에서 LocalDateTime 을 처음 쓸때... 여기서 스트레스 받는 분이 은근 많더라구요. POST 방식에서 사용하는 법. 우선 사용중인 Domain 클래스는 이런식으로 되어있어요. 아래는 생략~ html 파일에서 날짜를 선택할 거에요. 그래서 input 태그를 아래와 같이 만들어줬어요. {% codeblock %} {% endcodeblock %} Contorller 에서는 아래와 같이 만들어 줬어요. 전체 코드는 아니고 필요한 부분만 찰칵! {% codeblock %} @PostMapping("/product_detail/register") public String registerProduct(@ModelAtt..

Spring

Spring Web MCV

이번 포스팅은 spring mvc 에 대해 써보려해요! 스프링 MVC가 요청을 어떻게 처리하고 돌려주는지에 대해 알아보기로 해요! 스프링 MVC 요청 처리 과정 스프링은 위에 그림과 같은 구조로 요청을 처리해요. 요청을 디스패처 서블릿, 핸들러 매핑, 컨트롤러, 뷰 리졸버 등으로 이동시키고 응답하게 되는 구조예요! 우선 요청(1) 이 브라우저에서 떠나면서 사용자가 요구하는 내용을 전달하게 돼요. 적어도 URL을 포함하고 있으며 폼에서 입력된 값들처럼 더 많은 추가 정보들이 전달 될 수도 있어요. 요청의 첫번째 도착지는 스프링의 DispatcherServlet 이에요. 대부분의 자바 웹 프레임워크와 마찬가지로 스프링 MVC 역시 많은 요청들을 하나의 프런트 컨트롤러 서블릿에서 처리해요. 단일 프론트 컨트롤..

Spring

JPA findOne, getOne 차이점

JPA는 @Transactional 로 묶인 곳에서 Entity 를 관리해요. @Transactional 은 스프링에서 트랜잭션을 관리하는 방법 중 하나인데, 프록시를 이용해서 타겟 오브젝트를 감싸고 트랜잭션 시작/끝 부가기능을 앞뒤에서 제공해요. 때문에 외부에서 접근해야 프록시가 적용되기 때문에 @Transactional 이 적용된 자기 자신(this)의 다른 메소드를 호출하려면 그냥 하면 안되고 부가적인 작업이 필요해요. JPA는 데이터베이스로의 무분별한 접근을 막기위해 영속성 컨텍스트에서 엔티티를 관리해요. 엔티티를 관리할 때 Lazy 란 개념이 있어요. 어떤 엔티티의 모든 필드가 필요한것이 아닐 경우가 있어요. A가 B를 필드로 가지고 있는데, B엔티티의 모든 필드가 당장 필요한게 아니라 A엔티티..

Spring

JPQL @Query 2개 이상 프로젝션 리턴

JPQL @Query 메소드에서 2개 이상의 프로젝션을 리턴할 때 어떤식으로 받아야 하는지 알아볼게요!! 스프링 프로젝트를 진행중에 생겼던 이슈에 대해 적어볼까 해요! 이번 이슈는 JPQL 에 관한 이슈에요. SQL 문을 짜는 것도 고역이었는데 그 이후에도 이슈가 생겨서 정말 뚝배기 깨질뻔했네요. 먼저 대략... 2시간에 걸쳐서 겨우겨우 SQL문을 완성했어요. 이번 포스팅에 필요한 부분만 올리자면! select me.*, me.name , count(*) from member ~ group by ~ ; 많이 생략했지만 이것만 있어도 돼요! 겨우겨우 구현한 SQL 문! Mysql Workbench 에서 실행하면 결과 잘 나옵니다. 그런데! 프로젝션이 하나인 경우만 써봤는데... 이번 SQL문은 프로젝션이 ..

Spring

엔티티 json 변환시 생겼던 문제

이 엔티티를 json 형식으로 html로 보내려고 했는데 아래와 같은 오류가 났어요 ㅠㅠ. pom.xml 에 jackson-databind 도 추가해줬는데 안됐어요... ERROR 16972 --- [nio-8080-exec-2] o.a.c.c.C.[.[.[/].[dispatcherServlet] : Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Request processing failed; nested exception is org.springframework.http.converter.HttpMessageNotWritableException: Could not write JSON: I..

Spring

Application Context 에 대해서

Application Context 전체 계층 구조에서 최상단에 위치한 컨텍스트 서로 다른 서블릿 컨텍스트에서 공유해야하는 Bean 들을 등록할 수 있다. 웹 어플리케이션 전체에 적용 가능한 프로퍼티, DB연결, 로깅 기능에 이용된다. Servlet Context에 등록된 Bean은 이용할 수 없다. Servlet Context에 동일한 Bean이 있는 경우 Servlet Context의 Bean이 우선 적용된다. 하나의 컨텍스트에 적의된 AOP 설정은 다른 컨텍스트의 Bean에는 영향을 미치지 않는다. Servlet Context 서블릿에서만 이용되는 컨텍스트 다른 서블릿과 공유하기 위한 Bean들은 Application Context에 등록해놓고 사용해야 한다. DispatcherServlet은 자신..

Spring

NamedParameterJdbcTemplate

NamedParameterJdbcTemplate 클래스는 인덱스 기반의 파라미터가 아닌 이름 기반의 파라미터를 설정할 수 있도록 해주는 템플릿 클래스다. 인덱스 기반의 파라미터를 전달받는 물음표를 사용하지 않고 이름 기반의 파라미터를 쿼리에서 사용할 수 있도록 지원한다. @Repository public class BoardDao { private NamedParameterJdbcTemplate jdbc; // insert private SimpleJdbcInsert insertAction; public BoardDao(DataSource dataSource){ this.jdbc = new NamedParameterJdbcTemplate(dataSource); this.insertAction = new ..

Jadie Blog
'Spring' 카테고리의 글 목록