대고객 문자 발송 시스템 개발 중 트랜잭션 설계를 하며 트랜잭션 전파 속성, DB pessimistic lock 을 테스트 중이다.

삽질 내용 : 로직(Required) 윗단에 for update wait로 lock을 잡아놓고 밑에 DB update 로직을 REQUIRES_NEW로 처리하면 당연히 될거라 생각. 그런데 계속 멈춤 현상이 발생. 왜 그럴까 생각해보니 이미 한 트랜잭션에서 select lock을 잡아놓고 새로운 트랜잭션에서 Update를 하려고 하니 당연히 lock 걸려 있으니 안되는게 정상...

DB pessimistic lock 기능 잘 작동되네...ㅋ

Posted by 知彼知己百戰不殆
,

문제 : 스프링프레임워크를 사용 중인 프로젝트에서 오류 발생 시 rollback 처리가 되지 않음

원인 분석:
1. 메소드에 transactional 어노테이션이 추가되어 있으므로 당연히 오류 발생 시 rollback 될거라 생각했으나, 일단 기본 어노테이션 속성은 예기치 못한 오류에 대해서 rollback하므로 어노테이션에 rollback속성 지정
2. rollback 속성을 지정했음에도 rollback이 실행되지 않았고, 그대로 DB update로 이어짐
3. transaction이 생성되지 않고 그냥 처리된단 생각이 들어 application-context.xml 확인

해결 방안 : <tx:annotation-driven transaction-manager="transactionManager"/> 설정이 없어 추가

참고: annotation-driven: 등록된 bean 중 transactional 어노테이션이 붙은 것들에 transaction 적용

Posted by 知彼知己百戰不殆
,

***************************
APPLICATION FAILED TO START
***************************
Description: Failed to bind properties under 'spring.datasource.hikari' to com.zaxxer.hikari.HikariConfig: Property: spring.datasource.hikari.driver-class-name Value: net.sf.log4jdbc.sql.jdbcapi.DriverSpy Origin: class path resource [application.properties]:4:44 Reason: Failed to load driver class net.sf.log4jdbc.sql.jdbcapi.DriverSpy in either of HikariConfig class loader or Thread context classloader

구글링을 해도 gradle을 새로고침 하라는 얘기밖에 없었다. 하지만 난 이미 jar파일을 가지고 있었고, devtool로 스프링부트를 구동중이었으므로 변경되면 자동으로 스프링부트가 업데이트 되므로 당연히 적용이 돼있을 줄 알았다. 하지만 계속 에러가 나길래 서버를 완전히 끄고 재기동 했더니 잘 올라간다...

devtool로 실행해도 gradle로 새로 가져온 jar파일은 바로 적용이 안되는 것 같다.

Posted by 知彼知己百戰不殆
,

오류 1. 한글 깨짐 현상
제목, 내용에 한글을 입력하고 index페이지를 호출해봤으나 한글이 <?>이런식으로 모두 깨져서 알아볼 수 없게 출력.
구글링 했더니 모두들 charset을 UTF-8로 지정하면 된다는 말만 가득. 그러다가 어느 블로그를 봤더니 전체 파일 encoding을 UTF-8로 지정하라는 글을 봄. 

파일의 encoding을 UTF-8로 지정하니 잘 나왔다.

오류 2. 언젠간....

Posted by 知彼知己百戰不殆
,

1. Getter, Setter 어노테이션 사용을 했으나, 소스에서 getter오류가 날 때

롬복을 library에 넣어서만 되는게 아니라 설치를 해야 오류가 나지 않는다.
cmd창을 이용해 lombok jar파일이 있는 위치로 이동한다.

java -jar 파일명을 이용하여 jar파일 실행 후 IDE 재기동.

IDE 셋팅

STS에서 help → Install new software → https://projectlombok.org/p2 입력 → Lombok 설치파일 설치

Posted by 知彼知己百戰不殆
,

RestController 클래스를 만들고 어노테이션을 @RestController로 입력. 그러나 빨간줄로 restcontroller is not an annotation type 오류가 나며 해당 오류 내용이 나오며 import로는 불가능하고 @org.springFramework.~~ 형태로 어노테이션을 작성해야 했다.

뭔가 이상해서 구글링을 해보니 어노테이션 안의 RestController 클래스와 충돌이 발생해서 그렇다는 내용 확인.

그래서 Class이름을 RestApiController로 변경 후 에러 잡음.

 

Posted by 知彼知己百戰不殆
,

cmd창에서 mysql -u root -p 입력 시 'mysql'은(는) 내부 또는 외부 명령, 실행할 수 있는 프로그램, 또는
배치 파일이 아닙니다. 오류발생.

구글링을 통해 검색해본 결과 시스템 환경변수 path에 경로가 없어서 그렇다는 내용 확인.

path에 C:\Program Files\MySQL\MySQL Server 8.0\bin 추가

cmd접속 시도 결과 : 성공

Posted by 知彼知己百戰不殆
,

오류메시지 : Driver oracle.jdbc.driver.OracleDriver claims to not accept jdbcUrl

application.properties의 url부분을 잘 봐야 한다.

원인: oracle데이터베이스로 연결할 때 spring.datasource.hikari.jdbc-url=jdbc:oracle:thin:@localhost:1521/xe 라고 써야 하지만 url==이라고 =을 2번 써서 발생한 오류.

Posted by 知彼知己百戰不殆
,

JUnit 테스트를 돌리는데 갑자기 연결이 잘 되던 것이 에러가 났다. 한 가지 짐작가는 건 gradle 설정을 수정을 했기에 해당 부분에 대해 알아보았다.

기존(잘되던 것) : runtimeOnly 'com.oracle.database.jdbc:ojdbc8'

수정(잘 안 됨) : runtimeOnly 'com.oracle.database.jdbc:ojdbc6'

oracle이 설치된 곳을 보면 jdbc드라이버 버전을 찾을 수 있다. 그래서 oracle설치 폴더에서 jdbc드라이버를 찾아 jar파일이 있는 버전으로 다시 수정을 했다.

Posted by 知彼知己百戰不殆
,

Loading class `com.mysql.jdbc.Driver'. This is deprecated. The new driver class is `com.mysql.cj.jdbc.Driver'. The driver is automatically registered via the SPI and manual loading of the driver class is generally unnecessary.

mySql JUnit 테스트 class를 만들어서 테스트 중 해당 에러 발생.

jdbc 드라이버는 2가지 종류.

1. com.mysql.jdbc.Driver
2. com.mysql.cj.jdbc.Driver

1번은 deprecated이므로 2번을 써야함.

Posted by 知彼知己百戰不殆
,