All 17

java.lang.UnsupportedOperationException

서론 java.lang.UnsupportedOperationException은 특정 연산이나 기능이 현재의 상황에서 지원되지 않을 때 발생하는 예외입니다. 이 예외는 주로 불변 객체나 수정이 불가능한 상태의 컬렉션에서 발생하며, 이에 대한 적절한 처리가 필요합니다. 이 예외가 발생하는 두 가지 예제를 통해 어떻게 해결할 수 있는지에 대해 설명하겠습니다. Arrays.asList()로 생성된 고정 크기 리스트에 원소 추가 Collections.singletonList()로 생성된 리스트에 원소 추가 결론 이처럼 불변 컬렉션으로 선언된 객체에 대해서 가변 하게 사용하면, java.lang.UnsupportedOperationException가 발생할 수 있습니다. 아래 코드는 올바른 예제입니다. 이상입니다...

Java 2023.12.28

Slack으로 에러 알림 받기

현재 제가 담당하고 있는 팀 프로젝트에서 발생하는 에러를 효과적으로 처리하고, 팀원들이 이를 실시간으로 확인할 수 있도록 개선하고자 합니다. 간단하게 Slack webhook API를 활용하여 이를 해결해보려고 합니다. Slack webhook URL 생성하기 구현하기 전에 이미 slack workspace가 있다고 가정하고 설명하도록 하겠습니다. slack webhook을 생성하기 위해서는 아래와 같이 https://api.slack.com/apps 페이지에 접속해야 합니다. webhook를 생성하기 위해서는 app을 생성해야 합니다. “Create New App”를 클릭합니다. “From scratch”를 클릭합니다. 그리고 생성할 “App Name”을 적어줍니다. 이는 알람을 보내는 주체가 됩니다...

Spring 2023.06.01

Linux Terminal Backspace Issue

Description 리눅스 터미널에서 Backspace 키가 공백이나 제어 문자 (^H 또는 ^?)로 인식되는 경우에 해결 방법을 제시하겠습니다. Solution export TERM=vt100 Conclusion 이런 경우는 일반적으로 터미널 설정과 관련이 있습니다. 터미널은 환경 변수인 TERM을 사용하여 터미널의 유형을 식별합니다. TERM 변수는 터미널이 어떤 기능과 동작을 지원하는지에 대한 정보를 제공합니다. "export TERM=vt100" 명령은 TERM 환경 변수를 "vt100"으로 설정하는 것을 의미합니다. vt100은 오래된 터미널 유형 중 하나로, 대부분의 터미널에서 동작하는 터미널 에뮬레이터입니다. vt100으로 설정하면 백스페이스 키를 올바르게 인식할 수 있습니다. Refere..

Etc 2023.05.31

통합 테스트와 단위 테스트

글에서 나오는 예제의 구현 코드와 테스트 코드는 해당 링크에 있습니다. 이번에 팀 내에서 테스트 코드를 어떤 방법으로 작성하면 좋을지 고민하던 중, TDD와 BDD에 대해 다시 공부하게 됐습니다. TDD와 BDD 외에도 DDD, ATDD 등 수많은 xDD가 존재합니다. xDD는 모두 소프트웨어 개발 방법론입니다. x주도 개발이라고 해서, 어느 것을 중점으로 두고 개발을 진행할지 미리 정해 두는 것입니다. 저는 그중에서도 TDD와 BDD 그리고 테스트 코드에 대해 고민해 봤습니다. TDD 사진 출처 TDD는 테스트 주도 개발이라는 뜻입니다. 요구사항이 주어지면, 요구사항에 대한 에러를 고민하고 바로 에러에 대한 테스트 코드를 작성한 후, 해당 테스트를 통과하도록 구현 코드를 작성하는 개발 방법론입니다. 예..

Spring 2022.07.28

Spring batch란

해당 글은 이론 위주의 설명입니다. 실제로 구현한 예제는 여기에서 볼 수 있습니다. 이번에 배치 모듈을 사용해보게 됐습니다. 한 번도 배치 모듈을 사용해본 적이 없었지만, 앞으로 배치를 자주 사용하게 될 것 같아 공부하면서 내용을 정리해보려 합니다. 왜 사용할까? 크롤러로 어떤 사이트의 정보를 주기적으로 긁어 온다고 가정해보겠습니다. 크롤링할 때마다 개발자가 직접 API로 수행해야 할까요? 아닙니다. 자동으로 할 수 있다면 좋을 것입니다. 또한, 크롤링하는 정보의 양이 상당히 많다면 서버의 자원을 다 써버려서 다른 작업을 수행하기에 어려운 상태가 됩니다. 그렇다면, 사용량이 적은 시간대인 새벽에 처리한다면 좋을 것입니다. 그리고, 1억 개를 처리한다고 할 때 5만 번째에서 실패를 했는데 자동으로 5만 1..

Spring 2022.06.30

Adapter pattern

Adapter pattern 사진 출처 어댑터 패턴은 서로 호환되지 않는 두 인터페이스를 사용할 수 있도록 해줍니다. 클래스의 인터페이스를 클라이언트가 원하는 다른 인터페이스로 변환합니다. 인터페이스를 사용자가 기대하는 다른 인터페이스로 변환하는 패턴으로, 호환성이 없는 인터페이스 때문에 함께 동작할 수 없는 클래스들이 함께 작동하도록 해줍니다. 쉽게 말해서, 메모리 카드에 사진이 몇 개 있고 이를 컴퓨터로 전송해야 한다고 생각해보겠습니다. 그것들을 전송하려면 메모리 카드를 컴퓨터에 연결할 수 있도록 컴퓨터 포트와 호환되는 일종의 어댑터가 필요합니다. 이 경우 카드 리더는 어댑터입니다. 또 다른 예로는 유명한 전원 어댑터가 있습니다. 세 다리 플러그는 두 갈래 콘센트에 연결할 수 없으며 두 갈래 콘센트와..

Spring 2022.06.29

Spring batch BadSqlGrammarException

Description 스프링 배치를 처음 실행하려고 하면 BadSqlGrammarException 에러가 발생하는 현상이 있습니다. Error message java.lang.IllegalStateException: Failed to execute ApplicationRunner ... ... ... Caused by: org.springframework.jdbc.BadSqlGrammarException: PreparedStatementCallback; bad SQL grammar [SELECT JOB_INSTANCE_ID, JOB_NAME from BATCH_JOB_INSTANCE where JOB_NAME = ? and JOB_KEY = ?]; nested exception is java.sql.SQ..

Spring 2022.06.21

Java Thread

주제와 관련된 모든 예제는 여기에 있습니다. Thread 스레드란, 프로세스 내에서 작업을 수행하는 주체를 의미합니다. 하나의 프로세스(프로그램) 안에서는 여러 개의 스레드를 사용할 수 있습니다. 자바에서는 스레드를 인스턴스로 선언하여 사용할 수 있습니다. 각 스레드마다 run()이라는 일종의 main 메서드를 가지고 있고 run() 메서드를 통해서 작업을 처리하게 됩니다. Runnable Runnable interface 자바에서 Thread는 Runnable이라는 인터페이스를 구현하고 있습니다. 러너블 인터페이스는 함수형 인터페이스로서 스레드의 작업 행위를 구현할 수 있게 합니다. extends Thread vs implement Runnable 스레드 구현 법은 크게 두 가지가 있습니다. 첫 번째는..

Computer Science 2022.05.11

Immutable object, 불변객체

불변 객체란? 불변 객체란 재할당은 가능하지만, 이미 할당된 내부 데이터를 변경시킬 수 없는 것을 말합니다. 쉽게 말해서, 한 번 만들면 수정이 불가하고 수정하고 싶다면 다시 만들어야 합니다. 불변 객체의 예시 Java의 불변 객체의 대표적인 예로는 String이 있습니다. String.class를 둘러보면, 원시 타입의 필드 값인 value는 전부 생성자를 통해서 관리하고, 나머지 메서드는 Read Only만 가능합니다. 이 말이 뜻하는 것은 String은 한 번 할당하면 내부 데이터를 변경할 수 없고, 변경하고 싶다면 생성자를 통해서 재할당해야 한다는 것입니다. 즉, 불변 객체라는 말입니다. 평소에 String 값을 바꿀 때 변경하는 것처럼 보이지만, 사실은 아래처럼 변경하는 것이 아니라 재할당 해주..

Java 2022.04.17