헝D의 일기장
[트러블슈팅] 자바 Properties 파일을 못 읽는 현상
개발공부 2024. 11. 8. 17:39

문제자바 jar 파일을 배포하고 이를 실행하는 스크립트를 만들어서 어떠한 파일을 불러와야 하는 상황.파일은 디렉토리를 명시하지 않았고 파일명으로만 불러오려고 함.파일은 해당 스크립트와 동일한 디렉토리에 존재함. 테스트시 스크립트를 실행했을때 파일을 정상적으로 읽어왔음.해당 스크립트를 자동으로 실행하도록 크론탭에 등록하였고 그 후 크론탭에 의해 자동으로 실행되자 파일을 찾지 못하는 현상 발생 원인작업디렉토리의 문제.Properties.load 메소드를 사용시 경로 없이 파일 이름만 명시했을때 해당 파일을 현재 작업 디렉토리에서 찾게 된다.스크립트를 직접 실행했을때 작업디렉토리는 해당 스크립트가 위치한 경로로 잡혔기 때문에 문제가 없다.그러나 크론탭을 통해 스크립트를 자동 실행하면 작업 디렉토리는 스크립트가..

java PreparedStatement 재사용시 유의점
개발공부 2024. 11. 7. 18:00

내가 맡은 업무의 코드에는 java PreparedStatement를 사용하는 코드들이 아주 많다.근데 여기서 큰 문제점이 있었는데 PreparedStatement 를 재사용하는 방법이 잘못되어 있었다는 것이다.for(int i = 0; i 이런식으로  for문 안에서 객체를 재할당 해주고 마지막에 finally 문에서 pstmt를 close해주는 식이었다.하지만 이런 방식으로 사용한다면 가장 마지막의 pstmt만 close 되고 앞에서 할당한 pstmt는 절대 close 될 수 없는 구조를 가진다. String sql = "select name, aget from testTable where condition = ? ";pstmt = conn.prepareStatement(sql);for(int i =..

[트러블슈팅] 실제 데이터 값과 MyBatis를 통해 select 한 값이 다른 문제 - 오라클 char 타입 유의할점
개발공부 2024. 11. 7. 17:44

문제 오라클 developer에서 어떠한 select 쿼리를 날렸을때 값이 1이 나오는데 자바 프로그램에서 MyBatis 를 통해 파라미터를 넘기고 똑같은 쿼리를 select 했을때는 값이 0이 나온다. 근데 이러한 현상이 where 조건에 다른 값을 줬을때는 정상적으로 나오는 문제가 있었다. 원인 where 조건에 사용된 컬럼이 varchar 타입이 아닌 char 타입이었다. char 타입인 데이터는 지정한 길이보다 문자의 길이가 적을때 나머지 부분을 공백으로 채운다. 그렇기 때문에 MyBatis 로 실행했을때 해당 값이 공백까지 정확히 일치하지 않았기 때문에 developer 상의 결과와 달랐다. 해결 해당 컬럼은 char 8byte 의 데이터 타입을 가지고 있었고, 다른 데이터들도 모두 8byte ..

[트러블슈팅] jsch auth fail
개발공부 2024. 11. 7. 17:31

문제자바 jsch 이용해서 sftp 연동 개발 중 방화벽도 열려있고 터미널에서 sftp 접속도 정상적으로 되는데 자바 프로그램으로 실행할때만 connect 가 안되는 현상.테스트 서버에서는 이상 없었으나 동일한 소스로 스테이징 서버에 올리니 connet 시 auth fail 오류가 발생함. 해결 기존: connect를 시도할때 session.connect(port) 이렇게 포트 정보를 명시했음변경: port 정보를 명시하지 않고 session.connect() 로 소스 코드 변경 원인문법상 connect 시 port 정보를 넘기는게 문제가 되지는 않으나 처음에 jsch 세션 정보를 가져올때 포트 정보를 넘기기 때문에 connect 메소드에 port 정보는 넘기지 않아도 된다. 테스트 서버와 스테이징 서버..

[백견불여일타] Spring Data JPA
개발공부 2024. 1. 27. 17:57

ORM(Object Relational Mapping) : 객체와 관계형 데이터베이스 매핑하는 기술. JPA (Java Persistence API): 자바 ORM 기술에 대한 API 표준. 즉 인터페이스 -장점: 특정 데이터베이스에 종속되지 않고, 객체지향적 프로그래밍을 가능하게 해주며, 생산성 향상. -단점: 1.복잡한 쿼리 사용시에는 sql 사용하는게 나을 수 있음. native sql을 통해서 기존 sql 사용할수는 있지만 특정 디비에 종속되는 단점이 생겨서 JPQL을 지원함. 2.성능 저하 위험: 객체간 매핑 설계 잘못했을경우. 자동으로 생성되는 쿼리 많아서. Hibernate: JPA 인터페이스를 구현한 가장 대표적 오픈소스. JPA 동작방식 한개의 Entity Manage Factory --..

[백견불여일타] 프로젝트 생성
개발공부 2023. 11. 12. 17:05

https://cafe.naver.com/codefirst 백견불여일타 : 네이버 카페 로드북 출판사의 백견불여일타 시리즈의 학습 공간입니다. cafe.naver.com 깃허브: https://github.com/gituserhjlee/springbootShopProject 개발환경: 운영체제 - Window 11 IDE: IntelliJ Community JDK: JDK 11 스프링부트: 2.7.17 빌드툴 : Maven 데이터베이스: MySQL 스프링부트 특징: 톰캣(WAS) 자체 내장 빌드 구성 단순화 위한 'Spring Boot Starter' 의존성 제공 xml 설정없이 단순 자바 수준의 설정 방식 제공 JAR를 이용해 자바 옵션만으로 배포 가능 애플리케이션 모니터링과 관리를 위한 스프링 액추에..

멀티스레드 환경에서의 싱글톤 패턴
개발공부 2023. 8. 16. 20:58

회사에서 운영중인 웹 어플리케이션에서는 db 연결 프레임워크로 마이바티스를 사용하고 있다. 하지만 간혹 대용량 데이터를 처리해야하는 경우가 종종 있는데, 이러한 경우에는 마이바티스를 사용하는 것보다는 jdbc batch 방식을 이용하는 것이 성능에 더 좋아 batch 방식을 사용하고 있다. 그렇게 운영하던 와중 한가지 이상한 점을 발견했는데, jdbc 배치 처리를 위해 db 커넥션을 생성하는 클래스가 싱글톤 패턴으로 구현되었다는 것이다. 기본적으로 tomcat은 다중 유저의 요청을 멀티스레드로 처리하게 되고, 멀티 스레드 환경에서 싱글톤 패턴을 사용하게 되면 각각의 스레드가 static 변수에 접근할 수 있게 되면서 동시성 문제가 생길 수 있다. 즉 대용량 데이터를 처리하는 메뉴들을 여러명의 사용자가 동..

[트러블슈팅] 오라클 oracle 오류: 수치가 부적합합니다
개발공부 2023. 7. 29. 17:03

시스템 운영 중 원래 이상이 없던 select문에서 갑자기 '수치가 부적합합니다' 오류가 발생하면서 조회가 되지 않는 현상이 발생했다. 해당 쿼리는 테스트 DB에서 발생한 오류였으며 같은 쿼리를 운영DB에서 돌렸을때는 문제가 되지 않았다. 같은 쿼리인데 왜 테스트 DB에서만 문제가 있는지 생각해보니, 보통 경험적으로 이런 식의 오류가 있을때는 쿼리보다는 데이터에 문제가 있는 경우가 많았다. 이상이 있는 쿼리는 데이터 타입이 char인 컬럼 때문이었는데, 보통 char형의 데이터를 조회하려면 use_flag='0001' 이런식으로 따옴표를 붙여서 조회해야 하나 해당 쿼리에서는 use_flag=1 이라고 숫자로 조회하고 있었다. 운영 DB에서 문제가 되지 않았던 이유는 운영 DB의 use_flag 컬럼에는 ..

컨테이너 인프라 환경의 개념
개발공부 2023. 5. 21. 17:40

모놀리식 아키텍처하나의 큰 목적이 있는 서비스 또는 애플리케이션에 여러 기능이 통합돼 있는 구조.(하나의 애플리케이션 안에 모든 서비스가 포함돼 있으며 공통 데이터베이스를 가진다.)장점: 초기 단계 설계가 용이하며 개발이 단순하고 코드 관리가 간편단점: 서비스 운영 과정에서 수정이 많을 경우 어떤 서비스에서 이뤄진 수정이 연관된 다른 서비스에 영향을 미칠 가능성이 높다. 서비스가 성장하면서 기능이 추가될수록 서비스 간의 관계가 매우 복잡해질 수 있다.마이크로서비스 아키텍처 (MSA)개별 기능을 하는 작은 서비스를 독립적으로 각각 개발해 연결해서 각 서비스들이 독립적으로 동작할 수 있는 완결된 구조.(각 서비스가 관련된 기능과 데이터베이스를 독립적으로 가진다. 즉 각 서비스별로 필요 기능이 특화된 데이터베..

자바 유용한 람다식&스트림
개발공부 2023. 4. 2. 16:44

○ list 정렬List list = Arrays.asList("abc", "aaa", "bbb", "ddd", "aaa");Collections.sort(list, (s1, s2) -> s2.compareTo(s1)); ○list의 모든요소 출력list.forEach(i -> System.out.print(i+",")); ○list에서 특정 조건인 경우 제거list.removeIf(x -> x%2 == 0 || x%3 ==0); ○list 에서 replacelist.replaceAll(i -> i*10); ○map의 모든 요소를 {k,v} 형식으로 출력map.forEach((k, v) -> System.out.println("{"+k+","+v+"},")); ○메서드 참조(String s) -> Int..