자바 상속에 대해서 알아보기
·
자바
❓ 상속을 하는 이유어느 객체는 다른 객체의 하위 개념이 될 수 있습니다.EX) 자동차전기차가솔린차전기차와 가솔린차는 자동차라는 개념에 더 구체적인 개념입니다. 즉, 전기차와 가솔린차는 자동차에 속합니다. 그래서 자동차라는 개념에 속하는 공통 기능이 존재할 것입니다. 이런 경우에 상속을 이용하게 됩니다.👨‍👦‍👦 상속 관계상속을 이용하면 기존 클래스의 필드와 메서드를 상속받은 클래스에서 재사용할 수 있습니다.따라서 기존 클래스의 속성과 기능을 그대로 사용가능 합니다. 상속을 하기 위해서는 extends 키워드를 사용하고 1개만 가능합니다.코드로 예시를 들어보겠습니다.Car.javapublic class Car { public void move() { System.out.printl..
[Java] 백준 2457 : 공주님의 정원
·
알고리즘
문제오늘은 공주님이 태어난 경사스러운 날이다. 왕은 이 날을 기념하기 위해 늘 꽃이 피어있는 작은 정원을 만들기로 결정했다.총 N개의 꽃이 있는 데, 꽃은 모두 같은 해에 피어서 같은 해에 진다. 하나의 꽃은 피는 날과 지는 날이 정해져 있다. 예를 들어, 5월 8일 피어서 6월 13일 지는 꽃은 5월 8일부터 6월 12일까지는 꽃이 피어 있고, 6월 13일을 포함하여 이후로는 꽃을 볼 수 없다는 의미이다. (올해는 4, 6, 9, 11월은 30일까지 있고, 1, 3, 5, 7, 8, 10, 12월은 31일까지 있으며, 2월은 28일까지만 있다.)이러한 N개의 꽃들 중에서 다음의 두 조건을 만족하는 꽃들을 선택하고 싶다.공주가 가장 좋아하는 계절인 3월 1일부터 11월 30일까지 매일 꽃이 한 가지 이상..
EC2 CPU 사용량 급증 문제
·
트러블 슈팅
⚠️ 문제 상황프로젝트에서 프리티어로 사용하고 있는 EC2 CPU 사용량이 98%를 유지하다가 서버가 내려가는 문제가 발생했습니다.원인을 파악해보려고 하였지만, 쉽게 유추할 수 없었습니다. 해당 문제가 발생한 시각은 약 새벽 2시 30분쯤이었습니다.  🤔 문제 원인이전에 프로젝트 발표할 때의 CPU 사용량을 확인해본 결과, 최대 약 20%까지 사용되었던 것으로 확인하였습니다. 따라서, 일단 트래픽에 의한 증가는 아닐 것이라고 생각하였습니다.하지만 이 원인을 제외하고 다른 원인을 유추해내기는 어려웠습니다. 문제가 발생한 시각도 새벽 2-3시로 팀원이 개발중이지 않은 시간대였습니다. 또한 스케쥴러를 이용하긴 하지만, 새벽에 이루어지는 작업은 존재하지 않았습니다.해당 원인을 찾아보려고 검색한 결과, 프리티어..
Mybatis vs JPA
·
스프링
프로젝트를 진행하면서 DB 접근 기술로 Mybatis를 사용할지, JPA를 사용할지 고민이 되었습니다. 결국 Mybatis를 사용하기로 결정되었는데, 사용하면서 느낀 점에 대해서 이야기해보겠습니다.저의 짧은 지식으로 작성된 글이니, 틀린 내용이 있을 수 있습니다.Mybatis를 사용하며 불편한 점개발의 중점Mybatis를 사용하게 되면, SQL을 직접 작성해야 합니다. 물론 JPA를 사용한다고 해서 작성할 일이 없는 건 아니지만, Mybatis와 비교하면 상당히 적습니다.이는 전체 개발 시간에서 SQL을 작성하는 시간이 차지하는 비율이 더 높아진다고 할 수 있습니다. 프로젝트를 진행하면서 비즈니스 로직에 해당하는 코드보다 SQL을 작성하는 시간이 많아지게 되면서 소요 시간의 볼륨 자체가 커지는 듯한 느낌..
SELECT 작업에 트랜잭션은 필요할까?
·
스프링
우선 트랜잭션은 간단하게 설명하면, 하나의 안전한 작업을 보장합니다.계좌이체를 예시로 들어보겠습니다.A 잔고 5000원 감소B 잔고 5000원 증가A 잔고에서 5000원이 감소하고 나서, B 잔고가 5000원 증가하기 전에 이 과정이 실패했다고 가정해봅시다. 그러면 A 잔고에서만 5000원이 감소하는 문제가 발생합니다.이 때 데이터베이스가 제공하는 트랜잭션 기능을 사용하면, 둘 다 함께 성공해야 저장하고, 중간에 실패한다면 이전의 상태로 돌아갑니다. 이 때 데이터베이스에 정상 반영하는 것을 커밋(Commit), 작업 중 하나라도 실패해서 이전 상태로 돌아가는 것을 롤백(Rollback)이라고 합니다.스프링에서는 @Transactional 을 통해 트랜잭션을 수행합니다.그런데 ‘단순히 DB에 조회하는 작업..
배포 시 레디스 초기화 문제
·
트러블 슈팅
⚠️ 문제 상황프로젝트에서 재배포 시, 레디스 데이터가 초기화되는 문제가 발생했습니다.그 원인은 재배포할 때 마다 컨테이너가 다시 올라가게 되는데 이때, 도커로 관리되는 레디스 또한 다시 올라가게 되어 데이터가 초기화되었기 때문이었습니다.이를 해결하기 위해 찾아본 결과, 도커의 Volume을 설정하여 해결할 수 있었습니다.Docker Volume도커 볼륨은 컨테이너와 호스트 간에 데이터를 공유하거나 저장하기 위한 기능으로, 볼륨을 사용하면 데이터의 지속성을 유지하면서 컨테이너를 생성하거나 삭제할 수 있습니다.볼륨은 컨테이너 내부의 데이터를 외부로 링크를 걸어주는 기능입니다. 볼륨을 걸어준 데이터의 경우 컨테이너 내부에서 수정되는 즉시 볼륨이 걸려있는 외부의 데이터도 같이 수정되게 됩니다. 그리고 그 데이..
스프링 트랜잭션
·
스프링
📌 트랜잭션?데이터를 저장할 때 데이터베이스를 이용하는 이유는 무엇일까요?여러 이유가 있을 수 있지만, 대표적으로는 트랜잭션을 지원하기 때문입니다. 이는 하나의 거래를 안전하게 처리하도록 보장한다는 것을 의미합니다. 계좌이체 예시를 들어보겠습니다.A는 B에게 10,000원을 송금한다고 가정해 봅시다. A의 잔고를 10,000원 감소시키고 B의 잔고를 10,000원 증가시켜야 합니다.A의 잔고 -10,000B의 잔고 +10,0001번은 성공했는데 2번에서 문제가 발생하면 A의 잔고만 감소하는 심각한 문제가 발생합니다. 데이터베이스의 트랜잭션 기능을 사용하면 1, 2 둘 다 성공해야 저장하고, 하나라도 실패한다면 이전 상태로 돌아갈 수 있습니다.ACID트랜잭션은 원자성(Atomicity), 일관성(Cons..
배열의 구간 변화 빠르게 구하기
·
알고리즘
알고리즘 문제를 해결하는 도중에 해결하기 어려운 부분이 있었습니다.하나의 1차원 배열을 예로 들어보겠습니다.[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]위처럼 1차원 배열이 존재합니다. 이 때, 구간별 변경값이 주어집니다.배열의 인덱스 2부터 7까지 3을 더한다.이 때 어떻게 계산해야할까요?for문을 통한 계산가장 먼저 드는 생각은 for문을 통해 2부터 7까지 각각 3을 더해주는 방법입니다. 배열의 길이가 N이고 변경값이 M회 주어진다면, 시간복잡도는 $O(N * M)$입니다.이를 더 빠르게 계산하는 방법은 없을까요?이런 경우, 누적합 을 이용할 수 있습니다.누적합을 이용한 구간 변화예시를 통해 설명해보겠습니다.array = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]위 배열에 ..
테스트는 왜 필요할까?
·
스프링
인프런의 Practical Testing: 실용적인 테스트 가이드를 듣고 작성한 글입니다. 테스트 코드는 말 그대로 프로덕션 코드를 테스트하기 위한 코드입니다. 그래서 사실 귀찮다고 느껴질 때가 많습니다.프로덕션 코드를 작성하기에도 시간이 부족한데 테스트 코드를 왜 작성해야 할까요?📌 테스트 코드가 없다면..테스트 코드가 없다면, 프로덕션 코드를 수동으로 테스트하게 됩니다.포스트맨을 이용직접 웹사이트에 접속간략하게 위와 같은 방법으로 만든 기능들을 테스트하게 됩니다. 그리고 추후 프로덕션 코드가 확장하게 됩니다. 기존 코드와 별개로 동작한다면 상관이 없지만, 겹치는 부분이 있다면 어떨까요?테스트 영역이 겹치게 되거나, 코드가 변경된다면 기존 코드가 정상적으로 동작하는지 확인이 필요합니다. 즉, 다시 검..
Spring Data JPA 구현체 순환참조 오류
·
트러블 슈팅
프로젝트 내에서 Mybatis에서 JPA로 마이그레이션을 계획하고 진행 중 한 객체에서 순환참조가 발생하는 상황이 있었습니다.📌 순환참조가 발생한 상황순환참조는 Repository 계층에서 발생했는데요, 구조는 다음과 같았습니다.JpaUserRepositoryImpl은 JpaUserRepository를 주입받아서 사용합니다. JpaUserRepository와 JpaUserRepositoryImpl은 다음과 같습니다.(설명을 위해 간략하게 작성하였습니다.)public interface JpaUserRepository extends JpaRepository {}@Repository@RequiredArgsConstructorpublic class JpaUserRepositoryImpl implements U..