분류 전체보기
-
[Java] 금융 거래에는 BigDecimal을 사용하자.Language/Java 2024. 2. 19. 15:28
1. 개요 BigDecimal은 금융 관련 연산 같이 오차가 발생해서 안되는 상황에 사용되는 타입이다. float, double과 BigDecimal을 간단하게 비교해보자(float과 double에 대한 자세한 내용은 여기를 참고하세요). 내부 표현 방식: BigDecimal: 수를 정수(unscaled value)와 scale로 나눠서 표현한다. 예를 들어 1.23의 정수는 123이고 scale은 2다. float & double: 부동 소수점 표현에 따라 표현한다. 정밀도: BigDecimal: 임의 정밀도(메모리의 제한 내에서 원하는 만큼의 정밀도)를 갖는다. float & double: 각각 32비트, 64비트 수로 표현하여 값의 범위나 정밀도에 제한이 있다. 속도: BigDecimal: 무제한 ..
-
[DevOps] Jacoco와 Github Actions로 CI 구성하기DevOps 2024. 2. 14. 17:44
테스트 코드는 왜 필요할까? 테스트 코드는 소프트웨어가 의도한 대로 동작하는지 검증하여, 소프트웨어의 안정성을 보장한다. 테스트 코드 없이 기능을 개발하면 단기적으로는 작업 속도가 빠르게 느껴질 수 있지만, 서비스가 복잡해지기 시작하면, '추가된 코드가 서비스에 문제를 일으키지 않을까' 같은 불안감에 시달리게 될 것이다(경험담). 테스트코드가 이렇게 중요함에도 불구하고, 테스트 코드 작성은 번거롭기에, 마감일이 다가올수록 이를 미루게 된다. 이러한 상황에서 테스트 커버리지 측정은 큰 도움이 된다. 테스트 커버리지란? 테스트 커버리지는 코드가 얼마나 테스트되고 있는지를 나타내는 지표로, 커버리지가 특정 목표치에 도달하지 못할 경우 빌드와 배포를 차단할 수 있다. 이 방법은 바쁜 일정에도 테스트 코드 작성을..
-
[프로젝트 세팅] Docker Compose로 로컬 개발 환경 관리하기DevOps 2024. 2. 7. 18:48
배경 현재 필자는 예약 도메인에서 발생할 수 있는 동시성 문제를 알아보고 해결하는 GrabTable 프로젝트를 진행하고 있다. 본격적인 비즈니스 로직 구현에 앞서, 프로젝트 세팅을 진행하는 데 로컬 개발 환경 설정 문제에 직면했다. MySQL 8.0을 설치하고 실행하는 과정에서 예전에 설치했던 MySQL 5.X 버전과 포트 충돌이 발생한 것이다. MySQL 5.X을 종료하는 것으로 문제는 해결되었지만 로컬 개발 환경 세팅에 대한 몇 가지 불편함을 느꼈다. 중복 프로그램에 대한 포트 관리: 같은 프로그램을 여러 버전별로 설치했을 때 포트 충돌이 발생한다. 만약 두 버전을 모두 실행하고 싶을 때는 어떻게 해야 할까? 비효율적인 수동 설치: 로컬 환경은 프로덕션 환경과 최대한 일치해야 한다. 따라서 기존 프로..
-
[Java] 객체지향 설계원칙, SOLID 알아보기Language/Java 2024. 1. 11. 17:26
1. 개요 SOLID 원칙은 로버트 C. 마틴이 발표한 5가지 객체지향 설계원칙의 약자다. 각 글자는 다음과 같은 원칙을 의미한다. SRP(Single Responsibility Principle): 단일 책임 원칙 OCP(Open-Closed Principle): 개방 폐쇄 원칙 LSP(Liskov Substitution Principle): 리스코프 치환 원칙 ISP(Interface Segregation Principle): 인터페이스 분리 원칙 DIP(Dependency Inversion Principle): 의존 역전 원칙 이 원칙들의 목표는 응집도는 높이고 결합도를 낮추자는 고전 원칙을 객체지향 관점에서 재정의 한 것이다. 2. 응집도와 결합도 응집도를 높이고 결합도를 낮추면 유연하고 유지보수..
-
[Java] 객체지향 프로그래밍에 대해 알아보자Language/Java 2023. 12. 27. 17:52
1. 객체지향 프로그래밍이란? 객체지향 프로그래밍이란 프로그램을 데이터와 데이터를 처리하는 행동(메소드)을 가진 객체의 집합으로 보는 프로그래밍 패러다임이다. 프로그래머는 객체의 설계도인 클래스를 통해 객체가 가져야 할 상태와 행동을 정의하고, 객체를 생성하고 조립하며 프로그램을 개발한다. 하나의 역할을 수행하기 위해 필요한 데이터와 메소드를 객체로 묶어 사용하기 때문에 재사용이 용이하고, 유연하며, 유지보수하기 쉽기 때문에 대규모 소프트웨어 개발에 사용된다. 2. 객체지향 프로그래밍의 등장 배경 프로그래밍 패러다임은 절차지향 프로그래밍 → 구조적 프로그래밍 → 객체지향 프로그래밍 순서대로 등장하였다. 각 패러다임은 이전 패러다임의 단점을 보완하기 위해 고안되었으며 이들의 특징은 다음과 같다. 절차지향 ..
-
[회고] 일일커밋(Daily Commit) 100일 달성!Retrospect 2023. 12. 6. 19:46
꾸준히 공부하는 습관을 들이기 위해 매일 공부하고 공부한 내용을 TIL repository에 commit하자는 다짐을 한지 100일 째, 드디어 100일 연속 커밋을 달성하였다. 100일동안 '자바의 신', '스프링 입문을 위한 자바 객체 지향의 원리와 이해', '토비의 스프링'(읽는 중)을 공부하고 정리했는데 100일전과 나와 비교했을 때 나름 성장한 것 같아 뿌듯하다(아직 갈길이 멀지만 축하할 때는 축하해야 한다ㅋㅋㅋ). 앞으로 TIL 리포지토리에 기록한 내용을 정제하여 이 블로그에도 게시할 계획이다. 학습한 내용을 타인과 공유함으로써 보다 심도 깊은 사고를 하게 되며, 공유된 내용에 대한 피드백을 통해 성장할 수 있을 것으로 기대한다. 이를 통해 더욱 열심히 학습하고, 기술을 세련되게 다듬어 뛰어난..
-
[Java] equals와 hashCodeLanguage/Java 2023. 9. 27. 15:16
equals와 hashCode는 모든 클래스의 부모인 Object 클래스에 정의되어 있는 메소드다. 각 메소드는 다음과 같은 기능을 한다. equals: 두 객체가 같은지 비교하고 boolean을 리턴한다. 오버라이딩하지 않을 경우 두 객체의 주소값을 비교한다. hashCode: 객체의 고유값을 리턴한다. 오버라이딩하지 않을 경우 객체의 메모리 주소를 바탕으로 한 해시값을 리턴한다. 따라서 equals와 hashCode를 오버라이딩하지 않고 사용하면 객체의 속성값이 아닌 주소값을 비교한 결과를 리턴하게 된다. // Person 클래스 public class Person { private String name; private int age; public Person(String name, int age) ..
-
[AWS] Lambda(Edge)와 CloudFront를 이용하여 온디맨드 이미지 리사이징 구현하기AWS 2023. 9. 9. 13:21
때는 몇 주 전, 나는 크래프톤 정글에서 'RoadMaker'라는 로드맵을 생성하고 공유할 수 있는 웹 플랫폼을 개발하고 있었다. 그런데 테스트 과정에서 로드맵 썸네일의 용량이 크면 클수록 메인 페이지의 로딩 속도가 느려지는 문제에 부딪혔다. 예를 들어, 썸네일 하나가 대략 1MB라면 40개의 로드맵 썸네일을 불러오는 데 최대 40MB의 데이터를 다운로드해야 하게 된다. 이 문제를 해결하기 위해 Lambda와 Cloudfront를 사용한 온디맨드 이미지 리사이징을 구현했다. 오늘은 이 글을 통해 그 과정을 공유하고자 한다. 1. 온디맨드 리사이징이란? 'On-Demand'는 '요청 시에', '필요할 때' 제공된다는 것을 의미한다. 그런 의미에서 온디맨드 리사이징이란 이미지를 업로드할 때 미리 리사이징해 ..