[Java] SOLID (1) (Feat : 클린 아키텍처)
·
백엔드/Java
이전엔 객체 지향 설계의 5원칙을 나타내는 SOLID를 다음과 같이 이해하고 있었다.  SRP - 단일 책임 원칙 클래스(객체)는 단 하나의 책임만 가져야 한다.  OCP - 개방 폐쇄 원칙 확장에는 열려있고, 수정에는 닫혀있어야 한다. 기능을 추가해야 할 경우엔 확장을 통해 손쉽게 구현하고, 그에 따른 코드 변경은 최소화하는 것이 목적이다.  LSP - 리스코프 치환 원칙 자식 클래스는 언제나 부모 클래스를 사용해도 의도대로 로직이 실행되어야 한다.  ISP - 인터페이스 분리 원칙 인터페이스를 목적에 맞게 분리해야 한다. 단일 책임 원칙은 클래스에 해당하고, 이건 인터페이스에 해당하는 것이다.  DIP - 의존 역전 원칙 구현 클래스에 의존하지 말고 인터페이스에 의존해야 한다. 이를 통해 클래스 간의..
[DB] MySQL 테이블 복구 (Feat : 바이너리 로그)
·
백엔드
바이너리 로그를 사용한 복구 MySQL에서 바이너리 로그(Binary Log)란 데이터베이스 서버에서 수행된 모든 변경 작업을 기록하는 파일이다.  이 로그는 데이터 손실이 발생했을 때 복구 작업을 수행하거나, 복제하는 데 사용된다.  데이터베이스에 접속한 후, 아래 쿼리를 실행하면 저렇게 binlog.XXXXXX 파일이 있는데, 저 파일이 바이너리 로그이다.SHOW BINARY LOGS; 하나의 파일을 선택해 조회를 해본 결과 바이너리 로그의 형태는 다음과 같다.# 바이너리 로그 파일 열람 명령어mysqlbinlog binlog.000403#250120 18:02:05 server id 1 end_log_pos 2288 CRC32 0x89fd1c5e Query thread_id=10 exec_tim..
[백엔드] 코드 커버리지
·
백엔드
코드 커버리지 코드 커버리지란 화이트 박스 테스트의 일종으로 Code Coverage 말 그대로 ‘코드를 얼마나 커버하고 있느냐’를 수치로 나타낸 것이다.  정확한 정의는 소프트웨어 테스트에서 테스트된 코드의 비율이다.  만약 내가 작성한 메서드의 테스트 코드가 작성되어 있다면 코드 커버리지가 상승하는 것이다.  그리고 코드 커버리지가 높을수록, 테스트 코드가 프로덕션 코드 전반을 잘 검사하고 있다는 의미이다.  현업에서는 보통 75~80% 이상의 코드 커버리지를 목표로 설정하는 경우가 많다. 이는 코드의 신뢰성과 안정성을 위해서이다.  다만, 100% 코드 커버리지가 반드시 완벽한 테스트를 의미하지는 않는다. 테스트의 품질과 효율성 또한 중요하다.   코드 커버리지 측정 기준 라인 커버리지 실행된 코드..
[Java] 리플렉션
·
백엔드/Java
리플렉션 자바에서 리플렉션이란 런타임 시점에 동적으로 특정 클래스의 필드, 메서드, 생성자에 접근해 사용하는 자바 API이다.  가져오는 클래스의 정보는 모두 접근 제어자에 관계 없이 가져온다.  그리고 자바는 정적 언어이기 때문에 컴파일 시점에 객체 타입을 결정하지만, 자바 리플렉션 API를 사용한다면 런타임 시점에 타입을 동적으로 결정할 수 있다.  리플렉션 예제 코드public class Member { // 필드의 접근 제어자가 모두 다름 private String name; private int age; private String address; public String phone; // 기본 생성자는 필수 public Member() {} // 메서드..
[Java] 멀티스레딩 - 가상 스레드
·
백엔드/Java
가상 스레드를 이해하기 위해선 일단 JVM 스레드와 OS 스레드를 구분할 수 있어야 한다. JVM 스레드 (플랫폼 스레드), OS 스레드  두 스레드의 흐름은 다음과 같다.JVM에 있는 스레드가 start() 되면 새로운 OS 스레드를 만들어달라고 OS에 요청한다.새로운 OS 스레드가 생성될 때, JVM은 OS에게 요청하여 이 스레드에 필요한 스택 공간을 할당받는다.이 OS 스레드가 CPU에 접근하여 JVM Thread가 하고자하는 작업을 수행한다. 결국 OS는 스택 할당 및 CPU 스케줄링의 과정을 도맡아 하기 때문에, JVM 스레드의 실행에 대해 책임이 있다. JVM 스레드는 OS 스레드로 매핑된 후 CPU에서 실행되며, 이 과정에서 OS의 스케줄링 알고리즘에 따라 실행 순서가 결정되기 때문이다.  ..
[Java] 멀티스레딩 - 스레드 간 통신
·
백엔드/Java
세마포어  이전에 나온 synchronized 키워드나 락을 사용한 이유는 임계영역에 여러 스레드가 접근하는 것을 막고, 오직 하나의 스레드만 접근 가능하게하기 위해서였다. 세마포어도 이러한 이유 때문에 사용하는 기술이다. 하지만 여기서 더 나아가 세마포어는 오직 하나의 스레드만 허용하게 만들 수 있고, 더 늘릴 수도 있다. 즉, 임계영역에 접근하는 스레드의 수를 조절할 수 있는 것이다.  세마포어의 로직을 이해하기 가장 좋은 예시는 주차장이다. 주차장에 자리가 6자리 있는데, 모든 자리에 차가 주차되어있는 경우, 새롭게 들어온 차는 대기해야 한다.만약 한자리가 빠지는 경우, 주차 가능한 공간이 한 자리 늘어나고, 대기하고 있던 차량 중, 가장 먼저온 차량이 비어있는 자리에 주차한다.그 뒤에 온 차량은 ..