| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 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 |
- OIDC
- @Transaction(readOnly=true)
- fetch join
- Commit
- ngrinder
- redis
- 프로젝트 이름 변경
- 컨트리뷰터
- JPA
- awspring
- naturalid
- assert
- injellij
- batch insert
- websocket
- MySQLTransactionRollbackException
- oauth2.0
- @RequestMapping
- mockito
- convertAndSendToUser
- spring-cloud-starter-aws
- N + 1
- 정적 팩터리 메서드
- Git
- intellij
- @controller
- spring
- Cannotacquirelockexception
- AWS
- 이펙티브 자바
- Today
- Total
목록전체 글 (22)
정리정리
이슈최근에 새로 업데이트된 Spring boot 4.0.0를 이용해 코드를 작성해보고 있었는데, Spring Redis를 사용하는 코드에서 문제가 발생하였다.List results = stringRedisTemplate.executePipelined( new RedisCallback() { @Override public Object doInRedis(RedisConnection connection) throws DataAccessException { StringRedisConnection stringRedisConn = (StringRedisConnection) connection; // 예외 발생 부분 ... return null; } });해당 코드는 S..
소켓 통신을 구현하면서 비즈니스 로직 예외 처리를 구현하다가 겪은 삽질들을 기록하려고 합니다.목표는 크게 두 가지였습니다.전역적인 비즈니스 예외 처리subscribe 과정에서 예외가 발생할 경우, 구독에 실패하며 예외 처리우선 동작하는 최종 코드입니다.@Configuration@RequiredArgsConstructor@EnableWebSocketMessageBrokerpublic class WebSocketConfig implements WebSocketMessageBrokerConfigurer { private final AuthChannelInterceptor authChannelInterceptor; private final StompExceptionHandler stompExcepti..
@NaturalId@NaturalId는 NaturalId(자연 키) 임을 명시해 주고, 캐싱과 같은 추가적인 기능을 제공하는 하이버네이트의 어노테이션입니다.자연 키로 사용하고 싶은 필드 위에 붙여주는 방식으로 사용할 수 있습니다.이 어노테이션은 JPA의 어노테이션이 아니기 때문에 캐싱을 사용하려면 하이버네이트의 API를 사용해야 합니다.import org.hibernate.annotations.NaturalId;@Entity@Getter@NoArgsConstructorpublic class Member { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; @NaturalId private Strin..
demo 프로젝트를 생성하고 프로젝트 이름을 변경해 보도록 하겠습니다.settings.gradle에 있는 rootProject.name을 변경하려는 프로젝트 이름으로 변경하고 gradle refresh를 해줍니다.올바르게 변경이 되었다면 새로 변경된 프로젝트 이름이 위와 같이 변경됩니다.사실 저 부분은 Intellij에서 인식하는 프로젝트 이름입니다.Intellij의 프로젝트 설정(command + ;)에 들어가서 프로젝트 이름을 변경해도 위와 같이 보이게 되지만 settings.gradle의 값을 변경해 줘도 Intellij에서 자동으로 프로젝트 이름을 변경해 주기 때문에 따로 설정할 필요는 없습니다.마찬가지로 .idea/.name 파일도 Intellij를 종료 후 다시 프로젝트를 불러오면 현재 프로젝..
Assert란assert 조건식; //기본 형식assert 조건식 : 에러 메시지; //메시지 포함 형식assert age >= 0;assert age >= 0 : "나이는 음수일 수 없습니다";assert는 jdk 1.4에서 추가된 키워드로, 코드가 논리적으로 올바르게 작동하는지 확인하는 데 사용합니다. Assert, Exception 차이1. assert의 쓰임새어떻게 보면 if - exception의 간결한 표현이라고 생각할 수 있지만 둘의 쓰임새는 많이 다릅니다.마틴 파울러의 리팩토링 책에서도 assert의 사용법에 대해 다음처럼 언급합니다.• 코드에서 기본적으로 가정하고 있는 조건들을 주석이 아닌 Assertion을 사용해서 보다 명시적으로 나타낼 수 있다.• Assertion은 '반드시 ..
최근에 인프런의 스프링 강의 예제를 스프링 부트 3.1로 따라 치다가 겪은 문제점과 알게 된 점이 있어 정리해 보고자 글을 작성합니다. 문제 상황 우선 문제를 겪은 예제 코드는 다음과 같았습니다. @RequestMapping @ResponseBody public interface OrderControllerV1 { @GetMapping("/v1/request") String request(@RequestParam("itemId") String itemId); } public class OrderControllerV1Impl implements OrderControllerV1 { @Override public String request(String itemId) { return "ok"; } } AOP를 ..
2023.06.13 - [개발 기록] - 게시글 좋아요 기능 개선기 (동시성, 데드락) 이전 글에서는 게시글에 좋아요를 누를 때 발생하는 동시성 문제와 데드락에 대해 해결하고 개선을 해봤습니다. 이번에는 설계적인 측면에서 성능을 높일 수 있는 방법이 없을까 알아보던 중에 배치 작업에 대해 공부하게 되었습니다. 그래서 이번 포스팅에서는 좋아요 요청이 올 때마다 db에 insert를 하는 방식이 아닌, 캐시를 이용하여 여러 요청을 모아 한번에 배치 작업으로 db에 추가하는 작업을 기록해보려고 합니다. 캐시 전략 우선 배치 작업을 하기 위해 캐시 쓰기 전략인 Write Back 전략을 사용했습니다. Write Back 전략은 데이터를 쓸 때 캐시에만 데이터를 쓰고 일정 주기로 배치 작업을 통해 db에 데이터를..
사이드 프로젝트로 간단한 sns를 만들면서, 게시글에 좋아요를 누르는 기능을 만드는 과정에서 생긴 여러 문제점과 개선하는 과정을 기록해보려고 합니다. 기본적인 좋아요 기능 구현 우선 게시글(Post)과 좋아요(Like)가 일대다 연관관계에 있는 상태로 구현을 했습니다. @Getter @Entity @NoArgsConstructor(access = AccessLevel.PROTECTED) public class Post extends BaseTimeEntity { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; private int likeCount; public void increaseLikeCount() { this.li..