본문 바로가기

전체 글11

Java와 다른 Kotlin Kotlin을 공부하면서 Java와 다른 점을 정리한 글입니다. 내용이 계속 추가될 예정입니다.1. 변수 선언Javafinal String name = "Dex";int age = 12;Kotlin// 상수 변수 선언val name: String = "Dex"// 변수 선언var age: Int = 12// 추론 타입val name = "Dex"var age = 12세미콜론이 없다.추론 타입이 있어 자료형을 명시하지 않아도 된다.원시 타입이 없다.컴파일 시 때에 따라 원시 타입 또는 객체 타입으로 컴파일된다.자료형을 명시할 때는 : 뒤에 자료형을 작성한다.2. 함수 선언Javapublic void main(String[] args) { System.out.println("Hello, World!");}K.. 2024. 12. 5.
GitHub Actions와 Docker로 CI/CD 파이프라인 구축하기 혼자 개발 중인 토이 프로젝트에서 GitHub Actions를 활용한 CI/CD 구축 경험을 작성한 글입니다. 수정할 부분이 있다면 댓글 남겨주세요.배포 환경AWS EC2 (Ubuntu 24.04 LTS - FreeTier)GitHub ActionsDocker/Docker ComposeJava 21SpringBoot 3.xRedisPostgreSQLGitHub Actions 를 선택한 이유 CI/CD 도구 중 가장 유명하고 많이 사용되는건 아무래도 오픈소스인 Jenkins 입니다. 그만큼 참고할 자료가 많고 플러그인 기능도 많아서 여러 상황에 대처하기에도 좋습니다. 하지만 별도 서버를 설치해야 하고 UI 도 레거시하며 커스터마이징에 유연한 만큼 손이 많이 갑니다. 또한 대부분의 기능을 GitHub Act.. 2024. 12. 2.
Ubuntu 24.04 에서 Docker 설치하기 토이 프로젝트 진행 중 EC2에 Docker 설치가 필요했습니다.대부분 yum 으로 설치하는 가이드가 많길래 yum 없이 apt-get 으로 설치하는 방법을 설명해보겠습니다.사실 yum을 설치하려다가 Ubuntu 24.04 부터 기존 /etc/apt/ 경로에 있던 sources.list 파일을 사용하지 않고 /etc/apt/sources.list.d/ 경로에 있는 ubuntu.sources 파일을 사용하게 되면서 기존 레퍼런스들(ubuntu 22.04 LTS 기준)의 방법과는 다른 설정이 필요하게 됐고 그 과정이 번거로워 간단한 방법을 찾게 됐습니다.추가로 Ubuntu는 기본적으로 APT 패키지 관리자를 사용하고 yum은 CentOS/RHEL 계열에서 사용되는 패키지 관리 시스템이라는 점에서 APT를 사.. 2024. 11. 30.
Equals와 HashCode 는 왜 같이 재정의해야 할까? 들어가기 전에 우리는 VO를 만들 때 equals와 hashCode를 오버라이딩합니다. VO의 중요 특징 중 하나인 동등성(equality)이라는 가치를 지키기 위함입니다. 그렇다면 왜 이 두 메서드를, 그리고 왜 같이 재정의해야 하는지 알아보겠습니다.VO(Value Object)의 동등성 예를 들어 아래와 같은 코드의 실행 결과는 무엇일까요?public class Color { private final int r; private final int g; private final int b; public Color(int r, int g, int b) { this.r = r; this.g = g; this.b = b; } public s.. 2024. 11. 15.
Overloading & Overriding Overloading오버로딩은 메서드의 이름이 같더라도 매개변수의 개수 또는 타입이 다르면 정의하여 사용할 수 있음을 뜻합니다.오버로딩은 사전적으로 '과적하다' 라는 뜻으로 C 언어에서는 함수명이 고유하게 존재해야 합니다. 하지만 자바에서는 하나의 메서드 이름으로 여러 기능을 구현하기 때문에 '과적하다' 라는 뜻의 이름을 붙여준 것으로 보입니다.특징메서드 이름이 같아야 한다.리턴 타입만 다른 경우, 오버로딩할 수 없다.접근 제어자만 다른 경우, 오버로딩할 수 없다.파라미터 개수가 달라야 한다.파라미터 개수가 같을 경우, 데이터 타입이 달라야 한다.예시class OverloadingTest { public static void main(String[] args) { OverloadingMethods.. 2024. 11. 4.
POI Excel 인쇄 영역, 페이지 나누기 설정 POI 라이브러리를 이용하여 엑셀의 인쇄 영역을 구현하는 방법입니다. sheet.lockSelectLockedCells(true); // 셀 잠금sheet.getCTWorksheet().getSheetViews().getSheetViewArray(0).setView(PAGE_BREAK_PREVIEW); // 시트 보기를 페이지 나누기 미리보기로 설정sheet.setDisplayGridlines(false); // 시트 그리드 표시 유무PrintSetup print = sheet.getPrintSetup();print.setPaperSize(PrintSetup.A4_PAPERSIZE); // 인쇄 페이지 설정print.setScale((short) 80); // 인쇄 비율 설정(80%)print.setFi.. 2024. 11. 4.
레이어드 아키텍처의 문제점 계층형 아키텍처(Layered Architecture) 아래는 우리가 흔히 알고 있는 3계층 아키텍처를 표현한 그림입니다.  맨 위의 웹 계층에서는 요청을 받아 도메인 혹은 비즈니스 계층에 있는 서비스로 요청을 보냅니다. 서비스에서는 필요한 비즈니스 로직을 수행하고, 도메인 엔티티의 현재 상태를 조회하거나 변경하기 위해 영속성 계층의 컴포넌트를 호출합니다.  사실 계층형 아키텍처는 견고한 아키텍처 패턴입니다. 계층을 잘 이해하고 구성한다면 웹 계층이나 영속성 계층에 독립적으로 도메인 로직을 작성할 수 있습니다. 또한 원한다면 도메인 로직에 영향을 주지 않고 웹 계층과 영속성 계층에 사용된 기술을 변경할 수 있습니다.계층형 아키텍처는 데이터베이스 주도 설계를 유도한다. 웹 계층은 도메인 계층에 의존하고, .. 2024. 11. 4.
함수형 인터페이스(Functional Interface) 1. @FunctionalInterface@FunctionalInterface // 함수형 인터페이스 정의 시 견고한 관리 가능public interface RunSomething { void doIt(); static void printName() { System.out.println("Devlee"); } default void printAge() { System.out.println("3"); }} 함수형 인터페이스는 하나의 추상 메서드(SAM: Single Abstract Method)를 가지고 있는 인터페이스를 말합니다. 추가로 Java8 부터 인터페이스는 static 메서드와 default 메서드를 포함할 수 있고 함수형 인터페이스에서 해당 .. 2024. 11. 3.
JVM (Java Virtual Machine) JVM (Java Virual Machine) JVM 은 'Java Virtual Machine' 을 줄인 것으로 직역하자면 '자바를 실행하기 위한 가상 컴퓨터' 정도로 이해하면 됩니다. 자바로 작성된 애플리케이션은 모두 JVM 에서만 실행됩니다. (Kotlin, Scala 와 같이 JVM 기반의 언어도 동일) 일반 애플리케이션 코드는 OS만 거치고 하드웨어로 전달되는데 비해 Java는 JVM을 한번 더 거쳐서 전달되며 기계어로 완전히 컴파일되지 않고 실행 시에 해석되기 때문에 속도가 느리다는 단점이 있습니다. 그러나 요즘엔 바이트 코드(JVM이 이해하는 컴파일된 Java 코드)를 하드웨어의 기계어로 바로 변환해주는 JIT 컴파일러와 향상된 최적화 기술이 적용되어서 속도의 격차를 많이 줄였습니다. 위 그.. 2024. 11. 3.
옵저버 패턴(Observer Pattern) 신문 구독 옵저버 패턴은 신문 구독 매커니즘만 이해하면 쉽게 이해할 수 있습니다. 신문사가 사업을 시작하고 신문을 찍어내기 시작합니다. 독자가 특정 신문사에 구독 신청을 하면 매번 새로운 신문이 나올 때마다 배달을 받을 수 있습니다. 구독을 해지하기 전까지 신문을 계속 받을 수 있습니다. 신문을 더 이상 보고 싶지 않으면 구독 해지 신청을 합니다. 그러면 더이상 신문이 오지 않습니다. 신문사가 망하지 않는 이상 개인, 호텔, 항공사 및 기타 회사 등은 꾸준하게 신문을 구독하거나 해지합니다. 옵저버 패턴에선 신문사를 주제(subject), 구독자를 옵저버(observer)라고 부릅니다. 옵저버 패턴 한 객체의 상태가 바뀌면 그 객체에 의존하는 다른 객체에게 연락이 가고 자동으로 내용이 갱신되는 방식으로 일.. 2024. 1. 27.
전략 패턴(Strategy Pattern) 변화에 대응하는 방법 상속 변화하는 요구사항에 대응하기 위한 방법으로 상속은 좋지 않습니다. 상속을 계속 활용한다면 규격(조건)이 바뀔 때마다 서브클래스의 메서드를 전부 살펴보고 상황에 따라 오버라이드해야 하기 때문입니다. 위 클래스 다이어그램과 같이 Duck 이라는 슈퍼클래스를 상속하는 여러 오리 클래스가 있다고 합시다. 여기서 오리를 날게 하려면 어떻게 해야 할까요? 위 다이어그램처럼 모든 오리 클래스들은 Duck 클래스를 상속 받으니까 Duck 클래스에 fly() 메서드만 추가하면 되는걸까요? 만약 Duck 클래스를 상속하는 고무 오리 클래스가 있다면 어떻게 해야할까요? 날면 안되고 '꽥꽥'이 아니라 '삑삑' 소리가 나야 합니다. quack() 메서드를 오버라이드한 것처럼 fly() 메서드도 오버라.. 2024. 1. 27.