본문 바로가기
728x90
반응형

전체36

[JPA] @Transactional 멀티스레드 테스트 및 동시성 이슈 돌파 안녕하세요! 예약 시스템을 개발해 보면서 @Transactional 멀티스레드 테스트 시 발생하는 트러블슈팅과 동시성 이슈를 해결한 경험을 되짚기 위해 공유하려고 합니다. 관리가 필요해 누구나 꽤 높은 확률로 비슷한 경험을 해봤을 것이다. "그건 다 팔고 1인분 밖에 안남았는디~ 친구는 다른 거 주문혀~" 친구와 동일한 메뉴를 주문했지만 재료가 부족해 주문이 실패한 케이스다. 베테랑 아주머니께서는 냉장고의 상태를 고려하여 주문을 받은 것이다. 주문을 했어도 냉장고의 상태에 따라 주문이 됐을 수도 있고 메뉴를 변경해야 할 수도 있다. 그 말은 즉 냉장고의 상태는 공유되는 자원이고, 공유되는 자원은 정확한 상태 관리가 필요하다는 것이다. 이처럼 프로그래밍도 공유되는 자원은 정확하게 관리가 될 수 있도록 레이.. 2024. 3. 11.
[Procedure] 동시성 문제, GOTO를 활용한 PK에러 해결 안녕하세요! 동시성 문제를 저의 상황에 맞게 해결했던 경험을 공유하려고 합니다. 상황은 이렇습니다. 제가 운영 중이던 서비스는 시퀀스가 단순히 번호를 매기는 의미가 아닌 비즈니스적으로 의미 있는 번호로 사용되어야 했습니다. 그래서 프로세스 중간중간에 예외로 인해 시퀀스가 버려지는 일이 발생하지 않아야 했기 때문에 RDBMS의 시퀀스를 사용하지 않고, 직접 시퀀스 테이블을 만들어 시퀀스의 순서가 보장되도록 설계가 되었습니다. 하지만 이러한 설계에는 문제가 있었습니다. 발생한 에러를 보겠습니다. Error updating database. Cause: java.sql.SQLIntegrityConstraintViolationException: ORA-00001: 무결성 제약 조건(CHOICODE.SEQ_PK).. 2023. 9. 6.
[H2] JPA User 엔티티, 테이블 drop 에러 상황 H2 DB를 사용하고 있고, Jpa를 이용해 User 엔티티를 만들어 애플리케이션을 실행했다. 에러가 발생했다. Caused by: org.h2.jdbc.JdbcSQLSyntaxErrorException: Syntax error in SQL statement "drop table if exists [*]user"; expected "identifier"; SQL statement: 원인 나는 지금 H2 2.1.214 버전을 사용중인데 2.1.212 버전부터 user 키워드가 예약어로 지정되었기 때문이다. 해결 해결 방법은 3가지다. 1. @Table 사용하기 @Entity @Table(name = "users") public class User {...} 2. User 엔티티 이름 변경하기 @Ent.. 2023. 8. 20.
우왕좌왕 좌충우돌 Slow query 개선 경험기 안녕하세요. 우왕좌왕 좌충우돌 Slow query 개선 경험기를 공유해 보려고 합니다. 혹시 잘못된 내용이 있다면 알려주세요. 피드백은 언제나 환영입니다 :) 큰일이다 어느 날 정산 모듈에 사용자가 몰리면서 전체 시스템에 영향을 준 일이 발생했습니다. 문제의 쿼리는 정산 모듈에서 특정 기간, 특정 사용자의 누적 사용 금액을 조회하는 쿼리였습니다. 정산 시 매번 조회되는 쿼리였기에 개선이 필요한 상황이었습니다. 예제를 위해 Slow query를 필요한 부분만 추출해 보면 아래와 같습니다. SELECT SUM(B.AMOUNT) AS SUM_AMOUNT FROM TB_MST A , TB_DTL B WHERE A.ID = B.ID AND A.DATES BETWEEN '20230101' AND '20230831'.. 2023. 8. 18.
java scheduler 중복 호출 이슈 해결하기 1. 문제 발견 회사에서 로그를 확인하던 중 자바 스케줄러가 중복 호출되고 있는 것을 발견했다. 매일 새벽, 정해진 시간에 인사정보를 최신화시켜 주는 프로시저이다. 이 외에도 많은 프로시저들이 자바 스케줄러에 의해 중복 호출되고 있던 것이다. 중복 호출이 되고 있었지만 사용하는 데 전혀 문제가 없었기 때문에 지금까지 아무렇지 않게 넘어갔던 것 같다. 물론, B2B 서비스였기 때문에 새벽에는 사용량이 없어서 문제 되지 않겠지만, 이슈를 발견한 이상 모른 체 넘어갈 수 없었다. 2. 원인 톰캣 공식 문서에 아래와 같은 내용이 적혀 있다. 💡 내용을 요약해 보면 다음과 같다. 1. 자동 배포를 true로 설정했을 때, docBase를 정의할 경우 appBase 외부에 있어야 한다. 2. 명시적으로 정의할 경.. 2023. 4. 2.
[DB지식] MyBatis 사용 시 <!CDATA[ ... ]]> 사용 이유? MyBatis 사용 시 쿼리문에 비교 연산자와 같이 부등호 처리가 필요할 때가 있다. 하지만 비교 연산자를 사용했을 경우 error를 발생시키는데 그 이유는 비교 연산자인지 괄호인지 구분하지 못하기 때문이다. SELECT * FORM EMPLOYEES WHERE SALARY > 100 위 예시처럼 비교 연산자를 사용했을 때 MyBatis는 괄호인지 비교 연산자인지 구분하지 못한다. 이런 경우에 CDATA를 사용하면 CDATA 안에 들어가는 문장을 문자열로 인식해 구분할 수 있도록 도와준다. 사용방법은 아래와 같다. 100 ]]> 2021. 11. 1.
[Java] 생성자란? 생성자란? 객체 생성 시 초기화해주는 역할을 담당한다. 간단한 예로, 스마트폰 전원(객체)을 켜면 제조사 로고(생성자)가 등장(호출)하는 것과 같다. 생성자 특징을 살펴보면 다음과 같다. 클래스명과 메서드명(생성자)이 동일해야 한다. 리턴 타입이 없다. 객체 생성 시 단 한 번만 호출된다. 생성자를 사용하는 방법은 크게 2가지가 있다. 메서드에 매개변수 없이 호출하는 방법 메서드에 매개변수를 받아 호출하는 방법 바로 예제를 살펴보도록 하자. public class ConstructorTest { public ConstructorTest() { System.out.println("Constructor 객체생성 !!"); } public static void main(String[] args) { Const.. 2021. 10. 31.
[Spring] IoC(Inversion of Control : 제어의 역전)컨테이너란? 들어가면서.. Spring 하면 떠오르는 3 대장 IoC, DI, POJO가 있다. 이 중에서도 핵심 of 핵심 IoC 컨테이너가 무엇인지 오늘 알아보려고 한다. 우선 IoC 컨테이너가 무엇인지 알아보기에 앞서 컨테이너가 무엇인지부터 살펴보도록 하자. 컨테이너란? 한 가지 예시로 우리가 컴퓨터를 조립하는 회사에 다닌다고 하자. 고객에게 주문서가 들어오면 우리는 주문서대로 컴퓨터를 만들기 위한 부품들을 박스에 담게 되는데 그것을 컨테이너라고 한다. 마찬가지로 우리가 스프링을 사용할 때 만들어야 할 주문서대로 객체를 담아야 하는데, 소프트웨어상 그 객체들을 담는 공간을 일반적으로 컨테이너라고 한다. 그리고 컨테이너는 보통 인스턴스의 생명주기를 관리, 생성된 인스턴스들에게 추가적인 기능을 제공하도록 하는 것이.. 2021. 9. 29.
[IntelliJ] 포트 변경 방법 (ft. localhost:8080 로그인 창) 상황 강의를 듣던 중 http://localhost:8080 포트로 실행을 했을 때 화면이 나와야 하는데, 나오지 않고 로그인 화면이 뜨길래 그 이유를 찾아보았다. 이유 이전에 내가 Eclipse환경에서 개발했을 때 Oracle를 설치해 사용했는데, 높은 확률로 같은 8080 포트를 쓰는 Oracle 포트와 겹쳐서 나타나는 현상일 것이라고 한다. 해결방법 현재 알고 있는 해결 방법은 3가지가 있다. 1. server.xml 포트 변경 apachetomcat/conf/server.xml 경로로 찾아가 server.xml 파일 우클릭 후 편집에 들어가 아래와 같이 포트를 수정한다. 하지만 나는 이미 8090 포트로 변경 후 사용했었기 때문에 이 방법은 사용하지 못했다. 2. Oracle 서비스 중지 제어판 .. 2021. 9. 26.
[Spring] 스프링 빈(Bean)이란? Spring Bean이란? Spring IoC 컨테이너가 관리하는 자바 객체를 빈(Bean)이라고 부른다. 우리가 알던 기존의 Java Programming에서는 Class를 생성하고 new를 입력하여 원하는 객체를 직접 생성한 후에 사용했었다. 하지만 Spring에서는 직접 new를 이용하여 생성한 객체가 아니라, Spring에 의하여 관리당하는 자바 객체를 사용한다. 이렇게 Spring에 의하여 생성되고 관리되는 자바 객체를 Bean이라고 하고, Spring Framework에서는 Spring Bean을 얻기 위하여 ApplicationContext.getBean()와 같은 메소드를 사용하여 Spring에서 직접 자바 객체를 얻어서 사용하게 된다. * Application Context는 Bean들을.. 2021. 9. 24.
728x90
반응형