Mapped Diagnostic Context (MDC) 로깅 라이브러리에서 개발자의 로깅과 디버깅을 위해 지원하는 기술입니다. MDC를 사용하면 여러 스레드가 동시다발적으로 소스 코드를 실행할 때, 어떤 스레드에 의해 소스 코드가 실행되었는지에 대한 맥락을 로그 메시지에 추가할 수 있습니다. 특히 클라이언트-서버 아키텍처에서 여러 클라이언트가 동시에 한 서버로 요청을 보내면 각 요청에 대한 로그 메시지가 무작위로 출력될텐데요. 각 로그의 출처가 어떤 클라이언트인지 구분해야 할 때 MDC가 매우 유용합니다. 본 포스팅은 블로그 주인장의 'MDC는 어떻게 Request 단위로 값을 저장할까?'라는 궁금증을 계기로 작성되었는데요. MDC의 니즈와 사용법에 대해서는 이미 자세히 설명된 자료가 있어 아래 링..
JPA의 페치 전략이란JPA는 엔티티를 조회할 때 연관 관계의 엔티티를 언제 로딩해올지 설정할 수 있는 페치 전략을 제공하고 있습니다. Fetch 전략의 종류1. FetchType.EAGER (즉시로딩)2. FetchType.LAZY (지연로딩) 현업에서는 되도록이면 LAZY를 사용하라는 말을 들어왔는데, 이번 글을 써보며 왜 그런지 깊이 알아보고자 합니다. 먼저 두 가지 타입의 Fetch 전략에 대해 자세히 알아보겠습니다. 즉시 로딩(EAGER)엔티티를 조회할 때 연관 관계에 있는 엔티티까지 즉시 한 번에 조회합니다. @...ToOne 관계에서는 기본적으로 즉시 로딩 전략을 사용하도록 설정되어 있습니다. 즉시 로딩은 조회하는 엔티티와 연관 관계의 엔티티가 반드시 같이 사용되는 경우에 사용하면 좋습..
단위 테스트는 얼마나 격리되어야 하나요? 올해 새로운 토이 프로젝트에 TDD를 처음으로 적용해봤는데요. 테스트 코드를 짜던 와중에 과연 이 코드가 단위 테스트의 개념에 잘 부합하고 있는지 궁금해지기 시작했습니다. 대충 여러 자료를 찾아보니 대체로 모든 글에서 단위 테스트를 아래의 개념으로 설명하고 있었습니다.단위 테스트란 상대적으로 격리된 방식으로 코드의 구별된 단위를 테스트하는 것 😥.. 단위 테스트의 개념은 정말 애매하지 않나요?구별된 단위란 함수일까요, 아니면 클래스를 말하는 걸까요?테스트 대상을 대체 얼마나 격리해서 테스트해야 할까요?저는 단위 테스트를 작성하며 이 두 가지의 모호한 개념을 이렇게 인식했습니다. 1. 구별된 단위Spring Boot 기반 서버에서 Service Layer의 각 메..
자바의 예외 종류와 기본적인 예외 처리 방법부터 간단히 알아보자! 그 뒤에 스프링에서의 예외 처리 방법을 살펴보면 이해가 훨씬 편할 것이다 :) 예외의 종류: 체크 예외와 언체크 예외 자바의 예외는 java.lang.Exception 클래스와 그의 하위 클래스들로 이루어져 있다. 예외는 RuntimeException 클래스의 상속 여부를 기준으로 다시 체크 예외와 언체크 예외로 나뉜다. 체크 예외 체크 예외는 RuntimeException을 상속하지 않는 예외 클래스들을 말한다. 복구가 가능한 예외들이기 때문에 반드시 예외 처리 구문이 필요하다. try ~ catch문을 통해 해당 메소드 안에서 예외를 처리하거나 throws 문으로 해당 메소드를 호출하는 상위 메소드에게 예외를 넘길 수 있다. 체크 예외..
스프링 AOP 다이내믹 프록시를 이용해 분리한 트랜잭션 코드는 투명한 부가기능 형태로 제공돼야 한다. 프록시 팩토리 빈 방식의 접근 방법 한계 1. 부가기능이 타깃 오브젝트마다 새로 만들어진다. → 스프링에서 제공하는 ProxyFactoryBean 의 어드바이스를 통해 해결 완료! 2. 부가기능 적용이 필요한 타깃 오브젝트마다 거의 비슷한 내용의 ProxyFactoryBean 빈 설정 정보를 추가해줘야 한다. → 여전히 스프링의 ProxyFactoryBean에서도 문제가 되고 있다. 빈 후처리기 BeanPostProcessor 인터페이스를 구현해서 만든다. 스프링 빈 오브젝트로 만들어지고 난 후에 빈 오브젝트를 다시 가공할 수 있게 한다. DefaultAdvisorAutoProxyCreator 빈 후처리..
AOP AOP는 다소 내용이 길어 두 글로 나눈 점 감안해주세요 :) 트랜잭션 코드의 분리 5장까지 다뤘던 upgradeLevel() 메소드를 다시 한번 살펴보자. public void upgradeLevels() throws Exception { TransactionStatus status = this.transactionManager.getTransaction(new DefaultTransactionDefinition()); try { List users = userDao.getAll(); for (User user : users) { if (canUpgradeLevel(user)) { upgradeLevel(user); } } this.transactionManager.commit(status); ..
- Total
- Today
- Yesterday
- E_FAIL
- GitHubAPIforJava
- Linux
- GithubAPI
- cron시스템
- virtualbox
- 쇼미더코드
- OnActivityForResult
- baekjoon
- cat
- SELECT #SELECTFROM #WHERE #ORDERBY #GROUPBY #HAVING #EXISTS #NOTEXISTS #UNION #MINUS #INTERSECTION #SQL #SQLPLUS
- 백준27211
- api문서
- 리눅스
- awk프로그램
- atq
- 리눅스cron
- 코테
- linuxtouch
- Baekjoon27219
- Baekjoon27211
- 버추억박스오류
- 백준
- whatis
- linuxgedit
- linux파일
- linuxawk
- 버추억박스에러
- 사용자ID
- 백준27219
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |