재고시스템으로 알아보는 동시성 이슈 해결방법 해당 글은 인프런 | 재고시스템으로 알아보는 동시성 이슈 해결방법 강의를 보고 정리한 자료입니다. 모든 코드는 Github에 공개되어 있으며 각 해결 단계를 커밋으로 분리해두었으니 확인해주세요. 상품이 판매될 때마다 재고를 하나씩 줄여주는 기능을 만들어본다. 이 때 발생할 수 있는 동시성 문제를 하나씩 해결해보자. 문제발생 케이스 하나의 상품이 100개의 재고를 가지고 있을 때 단순하게 생각하면 판매될 때 재고를 -1 한 후 저장해주면 될거라고 생각할 수 있지만, 실무에서는 다양한 케이스가 발생할 수 있다. 대표적으로, 하나의 상품에 주문이 동시에 (ms 차이 수준) 들어온다고 가정을 한다. 이럴 때, Race Condition이 발생하여 최종 재고 값이 이상..
PasswordEncoder 설정하기 기존의 {noop} 문자열을 더해줘서 Password encoding 하던 것을 Spring Security가 지원해주는 PasswordEncoder를 사용해보겠습니다. Bean 등록 Application.java @SpringBootApplication public class Application { @Bean public PasswordEncoder passwordEncoder() { return NoOpPasswordEncoder.getInstance(); } // 1 public static void main(String[] args) { SpringApplication.run(Application.class, args); } } PasswordEncoder를..
JPA와 Security 연동 이전의 문제점 매번 유저를 추가하는 일이 생길 경우 코드를 수정해야 한다. 수정, 삭제도 마찬가지로 코드를 수정해야 한다. -> 위와 같은 문제를 DB를 연동하여 유저 정보를 관리할 수 있도록 수정해보겠습니다. (JPA를 사용하겠습니다.) 개선 JPA 설정 dependency 추가 build.gradle dependencies { ... // JPA implementation 'org.springframework.boot:spring-boot-starter-data-jpa' // H2 runtimeOnly 'com.h2database:h2' ... } class 생성 Account @Entity @Getter @Setter public class Account { @Id @..
Inmemory User 현재 기본으로 생성되는 유저와 패스워드 log를 확인해보면 UserDeatilsServiceAutoConfiguration에서 찍히는걸 확인할 수 있습니다. UserDetailsServiceAutoConfiguration.java User 정보는 SecurityProperties에서 가져오며 name, password, role을 설정 할 수 있습니다. yml 수정하여 기본 생성되는 유저 정보 변경하기 http://localhost:8080/login 에 접속하여 properties에 작성한 ID, Password를 입력해주면 기존처럼 접속이 가능합니다.. 문제점 유저 정보가 1개밖에 없다. 소스를 보면 어떤 유저정보가 있는지 확인할 수 있다. -> 그러므로 유저정보를 prope..
Spring Security Dependency build.gradle dependencies { implementation 'org.springframework.boot:spring-boot-starter-security' } 인증 가능 사용자 정보 알 수 있다. Security Setting SecurityConfig.java @Configuration @EnableWebSecurity @RequiredArgsConstructor public class SecurityConfig extends WebSecurityConfigurerAdapter { @Override protected void configure(HttpSecurity http) throws Exception { http.authoriz..
안녕하세요.저번 포스팅에 이어 Spring @EventListner 2편입니다.- Spring @EventListner 사용해보기모든 소스코드는 Github에서 확인하실 수 있습니다.비동기로 이벤트를 처리해보자.이전에 포스팅에서는 이벤트가 순서대로 처리가 되었습니다.이번 포스팅에서는 각각의 이벤트를 비동기로 처리하는방법에 대해 알아보겠습니다. 현재 코드를 조금 수정을 하였습니다.각각의 기능의 3초, 2초간 sleep을 하여 실행하게 하였고결과를 확인해보면 각각 2초, 3초가 걸리고 총 약 5초가 실행시간으로나오게 됩니다.이유는 Log에서도 볼 수 있듯이 같은 Thread에서 처리를 하고 있기 때문입니다.이제 비동기로 실행하는 방법을 보겠습니다. 우선 각각의 @EventListner 위에 @Asnyc 어노..
모든 소스는 Github에 있습니다. 안녕하세요. 오늘은 @EventListner 에 대해 공유해보도록 하겠습니다. 도메인 사이에 강한 의존성으로 인해 시스템이 복잡해지는 경우가 발생하는데 의존성을 줄이기 위한 방법으로 @EventListner를 소개하겠습니다. Case 1. 우선 예시로 좋은 주문예시를 들도록 하겠습니다. 주문을 하게되면 발생하는 이벤트들이 있을겁니다. 예를 들면, 주문완료 카톡발송, 이메일 발송 등이 있을 수 있습니다. 아래의 코드를 보겠습니다. @Service public class OrderService { @Autowired ApplicationEventPublisher applicationEventPublisher; @Transactional public void save(Or..
Spring Exception Handler 안녕하세요. 오늘은 스프링 부트를 사용하면서 Exception처리를 하는 방법에 대해 공유해보도록 하겠습니다. @ExceptionHandler 첫 번째는 @ExceptionHandler를 사용해서 Error를 처리하는 방법입니다. 우선 프로젝트를 하나 만들어줍니다. 프로젝트 만들기 IndexController.java @RestController public class IndexController { @GetMapping public ResponseEntity index() { return ResponseEntity.ok("Hello ExceptionHandler Example"); } } ResponseEntity를 반환하는 간단한 API입니다. @RestC..
- Total
- Today
- Yesterday
- FastAPI
- 스프링시큐리티
- @formula
- paawordencoder
- QueryDSL
- springboot
- spring web
- ResourceHttpReqeustHandler
- booleanExpression
- ubuntu
- 스프링
- java11
- 스프링부트 시작하기
- Security
- boot
- JPA
- Java
- ControllerAdvice
- howtoinstallnginx
- Python
- 스프링부트
- 개발
- 유사결과
- API
- 웹서비스
- Spring
- like절
- springsecurity
- mapstruct
- 자바
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |