Apache Kafka와 JMS란?Apache Kafka와 JMS(Java Message Service)는 모두 메시징 시스템을 구현하기 위한 대표적인 기술입니다. 두 기술은 목적이 비슷하지만 동작 방식과 설계 철학에서 뚜렷한 차이를 보입니다. 각각의 개념부터 살펴보겠습니다.JMS(Java Message Service)JMS는 자바에서 공식적으로 제공하는 메시징 API로, 애플리케이션에 메시징 기능을 손쉽게 구현할 수 있도록 도와줍니다. JMS는 두 가지 메시징 모델을 지원합니다.큐(Queue) 방식: 첫 번째 소비자가 메시지를 가
CountDownLatch와 CyclicBarrier는 모두 멀티스레드 환경에서 스레드 간 작업을 조율하기 위해 사용되는 대표적인 동기화 도구로, java.util.concurrent 패키지에 포함되어 있습니다. Java 공식 문서(JavaDoc)에서는 두 클래스를 각각 다음과 같이 정의하고 있습니다. CountDownLatch — 다른 스레드에서 수행 중인 일련의 작업이 완료될 때까지 하나 이상의 스레드가 대기할 수 있도록 지원하는 동기화 보조 클래스입니다. CyclicBarrier — 여러 스레드가 서로 공통된 장벽(barri
자바에서 불변 객체(Immutable Object)란 한 번 생성되면 내부 상태를 변경할 수 없는 객체를 의미합니다. 단, 다른 객체를 참조하는 것 자체는 가능합니다. 불변 객체는 여러 스레드가 객체의 상태를 변경할 수 없기 때문에 멀티스레드 환경에서 특히 유용하며, 덕분에 기본적으로 스레드 세이프(thread-safe)가 보장됩니다. 또한 불변 객체는 시간적 결합(temporal coupling)을 방지하는 데 도움이 되며, 항상 실패 원자성(failure atomicity)을 갖는다는 장점도 있습니다.반면 가변 객체(Mutabl
다형성(Polymorphism)이란?다형성은 객체 지향 프로그래밍(OOP)에서 가장 핵심적인 개념 중 하나입니다. 이름 그대로 하나의 작업을 여러 가지 형태로 수행할 수 있게 해주는 기능으로, 동일한 메서드 호출이라도 상황에 따라 서로 다른 동작을 하도록 만들 수 있습니다.다형성은 구현 시점에 따라 크게 두 가지로 나뉩니다.컴파일 타임 다형성(Compile-time Polymorphism): 메서드 오버로딩(Method Overloading)이 대표적인 예입니다.런타임 다형성(Runtime Polymorphism): 메서드 오버라이
String과 StringBuffer, 무엇이 다를까?자바에서 문자열을 다룰 때 가장 많이 사용하는 클래스는 String입니다. 하지만 문자열을 자주 수정해야 하는 상황에서는 StringBuffer가 더 적합할 수 있습니다. 두 클래스의 핵심적인 차이와 각각의 특징을 자세히 알아보겠습니다.String이란?String은 불변(immutable) 클래스로, 한 번 생성된 객체는 이후 수정할 수 없습니다. 문자열을 변경하는 것처럼 보이는 연산을 수행하면 실제로는 기존 객체가 변경되는 것이 아니라 새로운 객체가 생성됩니다.이러한 불변성 덕
Selenium WebDriver에서는 테스트 중 새롭게 열린 자식 브라우저 창(팝업 창)을 손쉽게 제어하고 닫을 수 있습니다. 이때 핵심 역할을 하는 것이 getWindowHandles()와 getWindowHandle() 메서드입니다.핵심 개념 정리1. getWindowHandles() vs getWindowHandle()getWindowHandles() 메서드는 현재 열려 있는 모든 브라우저 창의 핸들을 Set 자료구조에 저장합니다. 반면 getWindowHandle() 메서드는 현재 활성화된 브라우저 창의 핸들만 반환합니다.
Selenium WebDriver는 페이지 내 특정 DIV 영역을 직접 스크롤하는 전용 메서드를 제공하지 않습니다. 대신 Javascript Executor를 활용하면 원하는 DIV 위치까지 손쉽게 스크롤할 수 있습니다.동작 원리먼저 xpath 또는 CSS 선택자를 사용해 스크롤할 대상 DIV 요소를 찾아야 합니다. 이후 Javascript Executor를 통해 자바스크립트 명령을 실행하는데, Selenium에서 자바스크립트를 실행할 때 사용하는 메서드가 바로 executeScript입니다. 여기에 자바스크립트의 scrollInt
Selenium WebDriver를 사용하면 여러 개의 브라우저 창이 열려 있을 때 특정 창만 골라서 닫을 수 있습니다. 이때 핵심 역할을 하는 것이 getWindowHandles와 getWindowHandle 메서드입니다. 이 두 메서드를 활용하면 부모 창과 자식 창을 효율적으로 제어할 수 있습니다.창 핸들(Window Handle)의 기본 개념getWindowHandles() 메서드는 현재 열려 있는 모든 창의 핸들을 Set 자료구조에 저장합니다. 반면 getWindowHandle() 메서드는 현재 포커스가 맞춰져 있는 브라우저
Java는 현재 가장 널리 사용되는 엔터프라이즈 개발 언어 중 하나입니다. 객체 지향 프로그래밍의 핵심 언어로서, 엔터프라이즈급 애플리케이션과 테스트 플랫폼을 구축할 수 있는 훌륭한 생태계를 갖추고 있습니다. 다만 초보자에게는 Java 환경을 설치하고 익숙해지는 과정이 처음에는 다소 시간이 걸릴 수 있습니다. Docker 컨테이너를 활용하면 컨테이너 내부에서 Java 런타임 환경(JRE)에 바로 접근할 수 있습니다. 필요한 라이브러리가 이미 설치된 패키지형 환경을 손쉽게 관리할 수 있기 때문입니다. 로컬 머신에 Docker가 설치
Selenium WebDriver를 사용하면 브라우저에서 나타나는 HTTP 기본 인증(Basic Authentication) 팝업을 처리할 수 있습니다. 핵심 원리는 간단합니다. 페이지 URL 안에 직접 사용자 인증 정보를 삽입하는 것입니다. 즉, 일반적인 URL 형식 대신 사용자 이름과 비밀번호를 URL 경로 앞부분에 함께 넣어 요청하면, 별도의 팝업 조작 없이도 인증이 자동으로 통과됩니다.URL 인증 문법인증 정보를 포함한 URL의 기본 형식은 다음과 같습니다.https://사용자이름:비밀번호@URL 예시: https://ad
Selenium을 사용하면 테스트 실행 중 발생하는 브라우저 로그를 손쉽게 캡처할 수 있습니다. 브라우저 로그는 테스트 실패 원인을 분석하거나 콘솔 오류, 네트워크 문제 등을 디버깅할 때 매우 유용합니다.브라우저 로그 캡처 원리Selenium에서 로그를 캡처하려면 먼저 WebDriver 객체를 RemoteWebDriver 타입으로 형 변환(casting)한 후 초기화해야 합니다. 그다음 setLogLevel 메서드를 사용하여 원하는 로그 레벨을 설정하면 됩니다.RemoteWebDriver를 사용하기 위해서는 코드에 다음 import
Selenium에서는 여러 개의 브라우저 탭을 자유롭게 오갈 수 있습니다. 탭을 전환하려면 먼저 링크를 새 탭으로 열어야 하는데, 이때 Keys.chord 메서드와 sendKeys 메서드를 함께 사용합니다. Keys.chord 메서드는 한 번에 여러 개의 키를 조합해서 전달할 수 있도록 해주며, 조합하고자 하는 키나 문자열을 인수로 넘겨주면 됩니다.예를 들어 Keys.CONTROL과 Keys.ENTER를 Keys.chord 메서드의 인수로 전달하면 Ctrl+Enter 키 입력이 생성됩니다. 이렇게 만들어진 문자열을 sendKeys
웹 자동화 테스트를 진행하다 보면 세션이나 로그인 상태 초기화 등을 위해 브라우저에 저장된 쿠키를 제거해야 하는 경우가 자주 발생합니다. Selenium WebDriver는 이를 위해 두 가지 편리한 메서드를 제공합니다.첫 번째는 deleteCookieNamed 메서드로, 지정한 이름을 가진 특정 쿠키만 삭제합니다. 삭제할 쿠키의 이름은 메서드의 인자로 전달됩니다. 일반적으로 쿠키를 먼저 추가한 후, 조회하고, 마지막으로 삭제하는 순서로 테스트를 진행합니다.deleteCookieNamed 문법driver.manage().delete
Selenium을 사용하면 키보드의 Print Screen(화면 인쇄) 버튼 동작을 그대로 시뮬레이션할 수 있습니다. Print Screen 버튼을 눌렀을 때와 마찬가지로 현재 브라우저 화면이 스크린샷으로 캡처되며, 이 과정은 크게 세 단계로 진행됩니다.스크린샷 캡처는 자동화 테스트에서 실패 원인을 분석하는 데 매우 중요한 단계입니다. 테스트가 예상대로 동작하지 않았을 때 당시 화면 상태를 이미지로 남겨두면 문제를 빠르게 파악하고 재현할 수 있습니다.1단계: driver 객체를 TakesScreenshot 인터페이스로 변환Selen
Selenium을 사용하면 웹 페이지를 아래로 스크롤할 수 있습니다. 다만 Selenium은 스크롤 동작을 직접 처리하지 못하기 때문에, Javascript Executor의 도움을 받아 특정 요소(element)까지 스크롤을 수행해야 합니다.먼저 스크롤할 대상이 되는 요소를 찾아야 합니다. 그다음 Javascript Executor를 사용하여 자바스크립트 명령을 실행합니다. Selenium에서 자바스크립트 명령을 실행할 때는 executeScript 메서드를 사용하며, 여기서는 자바스크립트의 scrollIntoView 메서드를 활
두 개의 문자열 str1과 str2가 주어졌을 때, 재귀 호출 과정을 이용해 문자열 str1 안에서 부분 문자열 str2가 몇 번 등장하는지 세는 것이 이 글의 목표입니다.여기서 재귀 함수란 자신의 정의 내부에서 스스로를 다시 호출하는 함수를 의미합니다.예를 들어 str1이 I know that you know that i know이고 str2가 know라면,등장 횟수는 3입니다.구체적인 예제를 통해 살펴보겠습니다.입력str1 = TPisTPareTPamTP, str2 = TP;출력부분 문자열의 재귀적 등장 횟수: 4설명부분 문자열
두 개의 문자열 a와 b가 주어졌을 때, 문자열 b를 시계 방향 또는 반시계 방향으로 정확히 2칸 회전하여 문자열 a를 만들 수 있는지 판별하는 문제입니다. 예를 들어 다음과 같습니다.입력 예제 1 −a = google b = legoog출력 −True설명 − 문자열 google을 시계 방향으로 2칸 회전하면 뒤의 두 글자 le가 맨 앞으로 이동하여 legoog가 됩니다. 따라서 True를 반환합니다.입력 예제 2 −a = tuorialst b = tutorials출력 −False설명 − 문자열 tutorials를 어떤 방향으로 2
정렬되지 않은 정수 배열이 주어졌다고 가정해 보겠습니다. 이때 우리가 해야 할 일은 주어진 배열에 존재하지 않는, 즉 [0부터 n] 범위 안에서 빠져 있는 양의 정수를 찾아내는 것입니다.예제입력 1N = 9 arr = [0,2,5,9,1,7,4,3,6]출력8설명: 주어진 정렬되지 않은 배열에서 8만이 빠져 있는 양의 정수이므로 출력값은 8입니다.입력 2N = 1 arr = [0]출력1설명: 주어진 배열에서 1만이 빠져 있는 양의 정수이므로 출력값은 1입니다.문제 해결 접근 방법이 문제를 푸는 방법은 여러 가지가 있지만, 선형 시간
문제 개요 정수로 구성된 배열이 하나 주어져 있다고 가정해 보겠습니다. 이때 우리가 해야 할 일은 배열에서 가장 많이 등장하는 원소, 즉 과반수 요소(Majority Element)를 찾아내는 것입니다. 입력-1 − N = 8 A[ ] = { 1,2,4,3,3,1,1,5} 출력 − 1 설명 − 주어진 정수 배열에서 가장 많이 등장하는 숫자는 1입니다. 따라서 출력값은 1이 됩니다. 입력-2 − N = 6 A[ ] = {1,5,4,4,1,1} 출력 − 1 설명 − 이 배열 역시 가장 자주 나타나는 숫자가 1이므로 출력으로 1을 반환
N×N 크기의 정사각 행렬이 주어졌을 때, 이 행렬을 시계 반대 방향(반시계 방향)으로 90도 회전하는 것이 과제입니다. 예를 들어 다음과 같습니다.입력 −N = 3 matrix[ ][ ] = [ [1 2 3], [4 5 6], [7 8 9] ]출력 −3 6 9 2 5 8 1 4 7설명: 행렬을 시계 반대 방향으로 90도 회전하면 위와 같이 3 6 9 2 5 8 1 4 7 순서의 결과가 생성됩니다.문제 해결 접근 방식핵심 아이디어는 먼저 주어진 행렬의 전치 행렬(transpose)을 구한 뒤, 각 열(colum