이끌든지 따르든지 비키든지

Software Development 24

[Spotless] 클릭 한 번으로 코드 정리하기

Spotless란?코드 스타일 규칙을 자동으로 적용하여 코드베이스의 일관성 유지를 도와주는 오픈 소스 도구입니다.Gradle 플러그인으로 쉽게 통합할 수 있으며, Java, Kotlin, Groovy, Scala, Python, C, C++, Markdown, JSON, XML 등을 지원합니다.  Spotless를 의존성에 추가하기// build.gradleplugins { id 'java' id 'com.diffplug.spotless' version '6.25.0'}repositories { mavenCentral() gradlePluginPortal()}  Spotless를 사용하려면, Gradle 플러그인 포털에 대한 정보를 추가해주어야 합니다.gradlePluginPorta..

[PostgreSQL] PostGIS로 쉽고 빠르게 지리적 거리 계산하기

웹 애플리케이션에서는 사용자 경험을 향상하기 위해 지리적 위치 데이터를 활용하는 경우가 많습니다.예를 들어, 지도 및 내비게이션 서비스에서 두 지점 간의 경로를 안내하거나, 주변 장소를 검색하는 기능이 필요합니다. 오픈 소스 DBMS인 PostgreSQL과 이를 확장하여 공간 데이터를 처리할 수 있게 해주는 PostGIS는 공간 참조 시스템, 공간 데이터 타입, 공간 인덱스 등을 제공하여 복잡한 공간 데이터를 효율적으로 처리할 수 있도록 지원합니다. 이를 활용해 두 지점 간의 거리 계산, 주변 반경 검색, 경로 최적화 등 다양한 공간 연산을 수행할 수 있는데, 이 중 두 지점 간의 거리 계산에 대해 알아보도록 하겠습니다. PostgreSQL & PostGIS 설치하기 저는 Docker Compose 환경..

[Linux] 프로세스에게 시그널 보내기

들어가기 앞서 - 시그널(Signal)이란?시그널은 운영 체제가 프로세스 간 통신을 위해 사용하는 중요한 메커니즘 중 하나입니다. 시그널은 프로세스에게 특정 이벤트가 발생했음을 알리고, 프로세스가 그에 맞게 행동하도록 합니다.    SIGNAL의 특징비신뢰성리눅스 시그널은 비신뢰성을 가지고 있습니다. 이는 시그널이 도착하는 순서가 보장되지 않으며, 시그널이 손실될 수 있다는 것을 의미합니다. 여러 시그널이 동시에 발생하면 일부 시그널은 무시될 수 있습니다.  대기하지 않음시그널은 비동기적으로 처리됩니다. 이는 시그널이 발생하면 즉시 프로세스에 전달되며, 프로세스는 시그널을 기다리지 않고 자신의 작업을 계속 수행할 수 있습니다. 시그널이 도착했을 때만 프로세스는 이를 처리합니다.  대표적인 SIGNAL S..

[Java] Java 21의 새로운 기능 톺아보기

Java 17에 이은 다음 LTS 버전인 Java 21에 추가된 기능에 대해 알아보도록 하겠습니다. 💡LTS?LTS란, 'Long-Term-Support'의 약자로, LTS 버전은 다른 버전보다 장기적인 지원과 보안 업데이트를 포함하여 상대적으로 긴 기간 동안 지원됩니다.Java의 LTS 버전은 약 3년 주기로 출시되고 있습니다.  Java 21에 추가된 기능 총 15개의 기능이 추가되었고, 이를 4가지 카테고리로 분류할 수 있습니다. Core Java LibraryJEP 431: Sequenced CollectionsJEP 442: Foreign Function & Memory API (Third Preview)JEP 444: Virtual ThreadsJEP 446: Scoped Values (Pr..

[기술 면접 단골 질문] Spring

Spring DI / IoC 란?  의존성 주입(DI): 객체의 생성과 사용에 필요한 의존성을 객체 스스로 생성하지 않고, 외부(스프링의 경우 IoC 컨테이너)에서 주입하도록 합니다. 제어의 역전(IoC): 객체 생성, 의존성 연결, 메서드 호출 등 프로그램의 흐름을 개발자가 직접 제어하지 않고, 프레임워크에 맡기는 것을 말합니다.  IoC 컨테이너의 역할은 무엇이 있을까요? 빈의 생명주기 관리: 생성, 초기화, 소멸 과정을 관리빈의 의존성 관리: 빈 간의 의존성을 주입하고 관리빈의 설정 관리: XML, 어노테이션 등을 통해 빈의 구성 정보를 관리빈의 이름 해석: 이름이나 ID를 통해 특정 빈을 참조할 수 있게 관리   DI 종류는 어떤것이 있고, 이들의 차이는 무엇인가요? 생성자 주입: 의존성을 가진 ..

[기술 면접 단골 질문] Java

Java는? Java의 장 · 단점 Java는 플랫폼 독립적인 언어로, 자바 가상 머신(JVM) 위에서 동작하는 객체 지향 프로그래밍 언어입니다. 장점JVM 위에서 동작하기 때문에 운영체제에 독립적이다.가비지 컬렉터가 메모리를 관리해주기 때문에 편리하다.단점JVM 위에서 동작하기 때문에 실행 속도가 상대적으로 느리다.다중 상속이나 타입에 업격하는 등 제약이 있는 것이 많다.꼬리질문: Java가 다중 상속을 지원하지 않는 이유다중 상속을 지원하면, 다이아몬드 문제가 발생할 수 있기 때문입니다.Java가 다중 상속을 지원하지 않는 이유는 '다이아몬드 문제'를 방지하기 위해서입니다. 다중 상속을 허용하면 두 개 이상의 상위 클래스에서 상속받은 하위 클래스에서 같은 메서드를 가지게 될 경우, 하위 클래스에서는 ..

[Web] RESTful한 API란?

RESTful API란? RESTful API는 REST 원칙을 따르는 API입니다. REST(Representational State Transfer)는 인터넷 상의 시스템 간 상호작용을 위한 아키텍처 스타일입니다. RESTful API는 자원(Resource)의 표현(Representation)을 통해 상태 정보(State)를 주고 받는 구조로, 웹의 기본 프로토콜인 HTTP를 이용하여 구현됩니다.  💡RESTful API의 핵심 구성 요소자원(Resource): REST 아키텍처에서 모든 것은 자원으로 표현됩니다. 자원은 서버에 저장된 데이터나 서비스 같은 웹의 구성 요소를 의미하며, 고유한 URI(Uniform Resource Identifier)를 통해 접근할 수 있습니다.표현(Represen..

[Design Pattern] SRP(단일 책임 원칙)

객체지향적인 프로그램 설계 시 가장 중요하게 여겨지며 반드시 지켜야 하는 5가지 원칙이 있습니다. 이들 원칙의 첫 글자를 따서 SOLID 원칙이라고 부릅니다. 오늘은 그중 첫 번째인 단일 책임 원칙(Single Responsibility Principle, SRP)에 대해 알아보겠습니다. 단일 책임 원칙(Single Responsibility Principle, SRP) 단일 책임 원칙은 객체가 오직 하나의 책임만을 가져야 한다는 원칙을 의미합니다. 즉, 객체는 오직 하나의 변경 이유만을 가져야 합니다. 이는 하나의 클래스가 하나의 책임(기능)만을 담당하여 그 책임을 수행해야 한다는 의미로 해석될 수 있습니다. 현실 세계에서 맥가이버칼과 같은 다기능 도구는 여러 작업을 한 번에 해결할 수 있는 편리함을 ..

[Design Pattern] LSP(리스코프 치환 원칙)

LSP(Liskov Substitution Principle, 리스코프 치환 원칙)는 SOLID 원칙 중 하나로, 객체 지향 프로그래밍의 설계 원칙에 대한 중요한 개념이다. 이 원칙은 1987년 바바라 리스코프에 의해 처음 제안되어 리스코프 치환 원칙이라 부른다. 리스코프 치환 원칙 (Liskov Substitution Principle) 리스코프 치환 원칙은 "프로그램에서 부모 클래스의 인스턴스를 자식 클래스의 인스턴스로 대체(치환) 해도 프로그램의 정확성에 영향을 미치지 않아야 한다." 는 내용을 정의하는 원칙이다. 이 원칙은 자식 클래스(상속을 받은 클래스)가 부모의 클래스의 동작을 변경하지 않고, 확장해야 함을 말하며, 상속과 다형성을 적절하게 사용하는 방법에 대한 지침을 제공한다 볼 수 있다. ..

[Design Pattern] OCP(개방 폐쇄 원칙)

객체지향적인 프로그램을 설계할 때 가장 중요하고, 반드시 지켜야 할 5가지 원칙이 있다. 각 원칙의 앞글자를 따 SOLID 원칙이라 하는데, 오늘은 두 번째인 개방 폐쇄 원칙(Open-Closed Principle)에 대해 알아본다. 개방 폐쇄 원칙(Open-Closed Principle) 객체는 확장에 대해서는 개방적이고, 수정에 대해서는 폐쇄적이어야 한다는 원칙을 말한다. 확장에 개방적이다. 여기서 확장이란, 새로운 기능이나 동작의 추가를 말한다. 확장에 개방적이어야한다는 말은 새로운 기능을 추가하거나 기존의 기능을 확장할 때 기존 코드를 수정하지 않고 새로운 코드를 추가할 수 있어야 함을 의미한다. 수정에 폐쇄적이다. 기존의 코드는 수정을 피해야 한다. 기존 코드를 수정하면서 새로운 기능을 추가하거..