개발 과정에서나 운영 환경에서의 문제 해결에 있어서 로깅의 중요성은 아무리 강조해도 지나치지 않다. 로깅은 시스템의 내부 동작을 이해하고, 문제의 원인을 파악하는데 필수적인 정보를 제공한다. 이를 위해 로깅 시스템은 어플리케이션의 성능에 영향을 주지 않으면서 필요한 정보를 효과적으로 제공할 수 있어야 하며, 다양한 배포 환경과 상황에 따라 로깅의 세부 사항들을 조정할 수 있어야 한다. Java 개발 생태계에서는 다양한 로깅 프레임워크가 이러한 기술적 요구사항을 해결해 주고 있다. SLF4(Simple Logging Facade for Java)는 이들 프레임워크를 추상화한 표준화된 API로 제공하여, 개발자가 구체적인 로깅 구현체를 변경하고자 할 때 코드를 변경할 필요 없이 의존성만 교체함으로써 유연하게..
오라클(Oracle)에서 17버전부터는 NFTC(No-Fee Terms and Conditions)라는 새로운 라이센스를 내세우면서 무료로 사용이 가능하다는 것을 내세웠지만, 사실상 이는 무료의 사용 기간을 길게 한 것일뿐 무료 사용이 끝나는 기간에는 유료 결제를 해야 한다. 물론 자바의 버전을 계속 변경하다보면 사용이 가능할 것도 같지만, 문제의 여부를 테스트 해봐야 하고 수많은 서버가 있는 곳에서 이런 작업은 더욱 피곤하게 만든다. 그래도 다행인 것은 Java21이든 Java17이든 유료 라이센스에 영향을 주는 것은 운영서버 즉, 배포를 하는 환경일 뿐 개발자 환경에서는 OracleJDK로 하든 OpenJDK로 하든 상관이 없는 것으로 보인다. 처음에는 OpenJDK로 설치를 하여 진행하려고 했지만,..
Beautiful Soup이란? Beautiful Soup는 HTML 및 XML 문서를 파싱하기 위한 파이썬 라이브러리(Python Library)입니다. 웹 스크래핑(Web Scraping)에 사용되며, 복잡하고 비정형적인 웹 페이지로부터 필요한 데이터를 빠르고 쉽게 추출하는 것을 도와주고 있습니다. Beautiful Soup 예제 from bs4 import BeautifulSoup import requests # 스크래핑할 URL url = "https://needjarvis.tistory.com/802" # 해당 url에 연결한 후 HTML 내용을 가져옵니다. response = requests.get(url) html_content = response.text print(html_content)..
주피터 노트북(Jupyter Notebook)으로 간단하게 프로그램을 돌릴 때, 평상시에는 문제가 없지만 용량이 큰 것을 돌리기 위해서 C가 아니라 다른 드라이브로 돌려야 되는 경우가 종종 있습니다. 이럴 때에는 드라이브를 변경해야 하는데요 주피터의 드라이브를 변경하는 법을 포스팅 하도록 하겠습니다. 주피터 노트북 환경설정 생성 우선 드라이브를 변경하기 위해서는 주피터 환경설정 파일을 만들어야 합니다. (kogpt) C:\Users\user>jupyter notebook --generate-config Writing default config to: C:\Users\user\.jupyter\jupyter_notebook_config.py 위와 같이 jupyter notebook --generate-con..
마이바티스(MyBatis) 개요 마이바티스(Mybatis)는 2001년 클린턴 비긴이 만든 아이바티스(ibatis) 프로젝트의 3.0에서 포크된 프로젝트로 아파치 라이센스(Apache License) 2.0에 따라 배포되는 무료 소프트웨어[1]이다. MyBatis(ibatis 포함)의 특징은 기존 ORM 프레임워크와 달리 Java 개체를 데이터베이스 테이블에 매핑하지 않고, Java 메소드를 SQL에 매핑한다[2]. 그러다보니 자바 소스는 매우 간결해지고, 핵심은 SQL문을 포함한 XML 코드에 모두 포함이 되어 있다. 국내의 대형 SI들과 함께 단체로 개발을 할 때, Mybatis를 사용하는 가장 큰 이유는 바로 SQL문이 독립되어 유지보수가 편리해지고, 개발자 수준별로 코드를 분리할 수 있기가 용이하..
자바로 파일을 복사하는 3가지 방식을 설명해보도록 하겠습니다. 이것 이외에도 다양한 라이브러리를 사용해서 복사하는 방법들이 있지만, 아래의 방식만 알아도 큰 문제는 없을거라 판단해서 3가지를 선정해보았습니다. 1. FileInputStream/FileOutputStream 방식 우선 가장 고전적인 방식으로 InputStream, OutputStream 을 사용하여 byte를 복사하는 방식입니다. public static void main(String args[]) { String orgFilePath = "D:/test_copy/original.jpg"; String outFilePath = "D:/test_copy/copy.jpg"; System.out.println("status -> " + file..
Spring boot에서 가장 기본적으로 jdbc를 다룰 수 있는 jdbcTemplate에 대한 설정에 대해서 가볍게 설명해보도록 하겠습니다. 포스팅의 내용은 maven을 기준으로 작성하였고, DB는 MySQL 기준인 것을 참고하시면 되겠습니다. Spring boot 설정 Pom.xml org.springframework.boot spring-boot-starter-jdbc mysql mysql-connector-java spring-boot-starter-jdbc는 jdbcTemplate를 위함이며, mysql-connector-java는 mysql를 기반으로 connection을 하기 위함입니다. application.properties ## MySQL spring.datasource.url=jdbc..
Java에서 List 데이터의 값으로 오름차순을 하거나 내림차순을 하는 방법은 최하단 포스팅을 확인하시면 되며, 여기서는 데이터를 저장한 순서를 뒤집는 방법을 설명해보고자 합니다. 데이터 세팅 public static void main(String[] args) { String[] arrs = {"삼성전자","테슬라","비트코인","펄어비스","코카콜라"}; List list = new ArrayList(Arrays.asList(arrs)); System.out.println("리버스 이전 리스트 -> " + list.toString()); } # 리버스 이전 리스트 -> [삼성전자, 테슬라, 비트코인, 펄어비스, 코카콜라] 오늘은 주식이 우울한 관계로 떡상하자는 마음에 주식 종목들과 암호화폐 종목을 리..
자바로 파일을 직접 컨트롤하여 파일을 삭제해야 하는 경우 및 혹은 하위 디렉토리까지 삭제를 해야 하는 경우가 있을 수 있다. 예를 들어 로그 파일을 매일 폴더를 생성하여 관리를 하고 있는데 날짜값이 오래되었으면 삭제를 해야 한다면, 자바로 날짜값을 접근하여 폴더를 삭제하거나 폴더명을 날짜값으로 만들 경우 제거하는 경우가 있다. 이번에 할 것은 날짜값을 체크해서 삭제하는 것이 아니라, 특정 폴더를 지정하면 하위 폴더를 모두 제거하는 로직을 해보도록 한다. 테스트 데이터 테스트 하기에 앞서 로직의 실험을 위해 우선 폴더를 생성하였는데 아래와 같이 D드라이브에 test라는 폴더를 만들었으며 해당 폴더 안에는 여러개의 하위 폴더들을 생성하였고, test 폴더 안에는 test.txt라는 파일이 존재한다. test..
파이썬은 datetime과 time이라는 라이브러리를 제공하며, 이 값을 활용하여 날짜의 값을 분리하거나 N일을 기준으로 이후 이전, 이후 등을 구할 수 있다. import 라이브러리 import datetime as dt import time as tm datetime과 time 라이브러리를 호출한다. time과 dateime 사용 print(tm.time()) # 1647013868.527883 tm객체의 time 펑션을 호출하면, 시스템 타임(컴퓨터가 인식하는 시간, timestamp)이 찍힌다. 이 값을 이제 날짜 포맷으로 세팅한다. now = dt.datetime.fromtimestamp(tm.time()) print(now) # 2022-03-12 00:51:08.527909 datetime에..
콘다 패키지가 오래되어서 더이상 사용하기 힘들 경우 콘다 자체를 업데이트 시켜야 될 것이다. 명령어 conda update -n base conda 위와 같이 명령어를 실행하면 conda의 코어가 업데이트 된다. 실행과정 (base) Jinhooui-MacBook-Pro:~ stevejang$ conda update -n base conda Collecting package metadata (current_repodata.json): done Solving environment: done ## Package Plan ## environment location: /Users/stevejang/opt/anaconda3 added / updated specs: - conda The following packa..
Java에는 Http 상의 데이터 즉, URL 기반으로 파일을 download할 수 있는 다양한 라이브러리들이 있고, 기본 버전으로도 제공을 하고 있다. 본 포스팅은 3가지의 대표적인 방법들을 모두 써보고 비교하여 성능을 점검해보도록 하였다. 고전적인 방법 public static void fileDown(String url, String fileName) throws MalformedURLException, IOException { BufferedInputStream in = null; FileOutputStream fout = null; try { in = new BufferedInputStream(new URL(url).openStream()); fout = new FileOutputStream(f..