TIL(CS)
-
OOP의 SOLID 원칙
OOP의 SOLID 원칙S : Single Responsibility Principle클래스는 하나의 책임만 가져야 하며, 클래스가 변경되는 이유는 단 하나뿐이어야 한다하나의 클래스가 하나의 기능만 담당하도록 하여 코드의 응집도를 높이고, 유지보수를 용이하게 한다SRP 위반 예시Invoice 클래스가 여러 책임(기능)을 가지고 있다.Invoice 클래스는 청구서의 데이터 저장, 청구서의 프린트, 그리고 총액 계산을 모두 담당하고 있다.class Invoice { private double amount; public Invoice(double amount) { this.amount = amount; } public double getAmount() { retu..
2024.05.28
-
RDBMS의 ACID 트랜잭션과 NoSQL의 BASE 속성
ACID vs BASE 비교개념ACIDBASE가용성낮음 (일관성을 우선)높음 (가용성을 우선)일관성높음 (즉각적인 일관성)낮음 (최종적인 일관성)상태단단한 상태 (변경 불가능한 상태)부드러운 상태 (변경 가능한 상태)트랜잭션 격리강한 격리성약한 격리성시스템 설계 목표안정성과 신뢰성확장성과 가용성ACID 트랜잭션은 금융 거래와 같이 높은 일관성과 신뢰성이 요구되는 시스템에 적합하며, BASE 속성은 대규모 분산 시스템에서 높은 가용성과 확장성을 필요로 하는 시스템에 적합하다ACID 트랜잭션RDBMS에서 트랜잭션의 신뢰성과 일관성을 보장하는 속성Atomicity (원자성)트랜잭션의 모든 작업이 완전히 수행되거나 전혀 수행되지 않아야 함을 보장트랜잭션 중 일부 작업만 수행되거나 실패하는 경우, 시스템은 트랜잭..
2024.05.28
-
NoSQL의 CAP 이론(The CAP theorem)
CAP 이론분산 데이터베이스 시스템의 기본 원칙특히 NoSQL 데이터베이스와 관련이 깊다.일관성 (Consistency, C)모든 읽기 요청은 가장 최근의 쓰기 결과 또는 오류를 반환한다분산 시스템의 모든 노드가 동일한 데이터를 동시에 볼 수 있다.모든 클라이언트가 일관된 데이터를 보도록 보장한다가용성 (Availability, A)모든 요청(읽기 또는 쓰기)은 최신 데이터를 보장하지 않더라도 응답을 받는다시스템은 항상 운영 상태를 유지하며 응답성을 갖는다.장애가 발생하더라도 시스템은 요청을 처리한다(비록 반환된 데이터가 최신이 아닐 수 있지만).분할 허용성 (Partition Tolerance, P)네트워크 분할로 인해 일부 노드가 통신할 수 없게 되더라도 시스템은 계속 작동한다시스템은 임의의 네트워크..
2024.05.28
-
클러스터링과 샤딩의 차이점
ClusteringSharding목적Purpose고가용성(High Availability), 로드 밸런싱(Load Balancing)확장성(Scalability), 성능 향상(performance improvement)구조여러 개의 데이터베이스 인스턴스(Node)가 하나의 클러스터를 구성인스턴스는 서로 복제(replication)되어 동일한 데이터를 유지여러 개의 독립된 데이터베이스 인스턴스(샤드)로 분할하여 저장하고, 샤드 키를 통해 데이터를 적절한 샤드에 분배 시스템의 확장성과 성능을 향상시킴데이터 분포 Data Distribution모든 노드가 동일한 데이터 저장All nodes store the same data각 샤드가 일부 데이터만 저장Each shard stores only a subset ..
2024.05.28
TIL(Develop)
-
ktlint 자동적용 안 되는 경우 해결법
저장하면 자동으로 적용된다는 팀원들과 다르게ktlint 자동적용이 안 돼서 build한다음 stacktrace에서indentation 6 ->8 로 하나하나 줄 찾아가서 수정하고 trailing comma 찍어주고 하는 삶을 살길 한 달째... 오늘 이것을 발견했다gradle 탭에서 이것을 눌러주면 자동으로 적용이 된다...여태까지 헛된 삶을 살아왔던 것이다
2024.06.02
-
String과 StringBuilder, StringBuffer의 차이
Java에서 String, StringBuilder, StringBuffer는 문자열을 다루기 위한 클래스들로, 각각의 특성과 사용 목적이 다르다.이 클래스들의 차이점은 주로 불변성, 성능, 그리고 동기화 여부에 있다.아래에서 각 클래스의 특징과 차이점을 상세히 설명하겠다.String주요 특징불변성 (Immutability)String 객체는 한 번 생성되면 수정할 수 없다문자열을 변경하는 모든 작업은 새로운 String 객체를 생성한다불변성의 장점불변성 덕분에 String 객체는 스레드 안전(thread-safe)하며, 해시 코드가 캐시되기 때문에 효율적으로 사용할 수 있다성능문자열 결합과 같은 작업에서 많은 새로운 객체를 생성하게 되어 성능이 떨어질 수 있다예제public class StringExa..
2024.05.31
-
제네릭(Generic)이란
Java에서 제네릭(Generic)은 클래스, 인터페이스, 메서드 등에 사용할 수 있는 타입 매개변수화 기법을 말한다.제네릭을 사용하면 컴파일 시 타입을 체크할 수 있으며, 코드의 재사용성을 높이고, 타입 안정성을 보장할 수 있다.제네릭은 자바 5에서 도입되었으며, 주로 컬렉션 프레임워크에서 많이 사용된다.제네릭의 주요 특징타입 안전성(Type Safety) 보장컴파일 시점에 타입을 체크하여 런타임 에러를 줄일 수 있다타입 캐스팅 제거제네릭을 사용하면 불필요한 타입 캐스팅을 제거할 수 있다코드 재사용성 증가다양한 타입에 대해 동일한 코드를 사용할 수 있다제네릭의 기본 사용법제네릭 클래스제네릭 클래스는 클래스 선언 시 타입 매개변수를 사용하여 정의할 수 있다다음은 제네릭 클래스를 사용하는 예제이다publi..
2024.05.31
-
Java volatile / synchronized
Java에서 volatile과 synchronized는 멀티스레딩 환경에서 안전하게 데이터를 접근하고 수정하기 위한 동시성 제어 키워드이다.이 두 키워드는 각각 다른 방식으로 동기화를 제공한다.volatilevolatile 키워드는 변수의 값을 모든 스레드가 항상 최신 상태로 읽을 수 있도록 보장한다.자바 메모리 모델에서 각 스레드는 자신의 캐시를 사용하여 변수를 읽고 쓸 수 있다.volatile로 선언된 변수는 각 스레드의 캐시에 저장되지 않고 항상 주 메모리에서 읽고 쓰기 때문에 여러 스레드가 동시에 접근하더라도 일관된 값을 보장한다.주요 특징변수의 가시성 보장volatile로 선언된 변수는 각 스레드가 해당 변수의 최신 값을 볼 수 있도록 한다.원자성 보장 불가volatile은 변수의 읽기/쓰기의 ..
2024.05.31
Journal
-
한 시간 후 만료되는 초대 링크 개발기 : DB 구성에 대한 고민
디스코드 클론코딩 서비스를 개발하면서채팅방 입장 링크를 발급해준 후 한시간 후 만료시키고만료되지 않은 코드라면 참여가 가능하게 해야하는 기능을 개발해야했다 Key:Value 형태로 간단하게 저장할 수 있을 것 같고 만료되는 기능도 TTL로 하기 쉬운 Redis를 쓰기로 했는데, 코드 발급 시에는 채팅방id, userId -> 코드 이렇게 접근해야 했고코드로 참여 시에는 코드 -> 채팅방 id 이렇게 접근해야 했다 그러나 Redis는 Key로 Value를 찾는 것은 효율적인 반면, Value로 Key를 찾는 것은 효율적이지 않아서처음에는 채팅방id, userId -> 코드, 코드 -> 채팅방 id 이렇게 DB를 두개로 나눠서 저장했다 @Serviceclass ChatRoomService( private..
2024.06.20
-
✨Repository가 다르다고 Model도 다를 필요는 없다👍
✨Repository를 나눠서 model도 나눴던 것 통합서버 채팅을 조회할 때는 채팅방 채팅을 조회할 필요가 없고채팅방 채팅을 조회할때는 서버 채팅을 조회할 필요가 없는데둘 다 ChatRepository에 저장하게 되면 조회 성능이 안 좋아질 것 같아서Repository를 RoomChatRepository , ServerChatRepository로 분리했었다@NoArg@Document(collection = "chats")class RoomChat( val userId: String, val roomId: String, val content: String,) : BaseTime() { @Id var id: String? = null fun isEdited(): Boolean { retu..
2024.06.20
-
Service에서 다른 Service 를 의존하게 하기
채팅방 기능을 개발할 때 ChatRoomService에서 좀 동떨어진 Invitation 관련 기능들을 많이 이용하게 되었는데그게 ChatRoomService에 있으면 좀 의미가 맞지 않는 것 같아서 모두 InvitationRepository로 분리해서 코드를 구축했다@Serviceclass ChatRoomService( private val chatRoomRepository: ChatRoomRepository, private val invitationRepository: InvitationRepository,) {fun getChatRoomInvitation( chatRoomId: String, userId: String, ): InvitationResponse { verifyCh..
2024.06.20
-
깃허브 프로필 꾸며보기!!
내 이름이랑 동일한 이름의 repository를 만들면 내 깃허브 Overview에서 확인할 수 있다! README file을 추가해준다! https://shields.io/ Shields.io | Shields.io Concise, consistent, and legible badges shields.io 이걸 이용해서 뱃지를 달아봄! Static Badge에 들어가서 오른쪽에다 입력해주면 자동 생성해준다! https://simpleicons.org/ Simple Icons 2988 Free SVG icons for popular brands simpleicons.org 여기 가서 아이콘 찾아옴 ![{Name}](https://img.shields.io/badge/{Name}-{HexCode}?styl..
2024.02.09
Coding Test
-
[백준] 구간 합 구하기 5
문제 주소https://www.acmicpc.net/problem/11660문제 설명N×N개의 수가 N×N 크기의 표에 채워져 있다. (x1, y1)부터 (x2, y2)까지 합을 구하는 프로그램을 작성하시오. (x, y)는 x행 y열을 의미한다.예를 들어, N = 4이고, 표가 아래와 같이 채워져 있는 경우를 살펴보자.1 2 3 4234534564567여기서 (2, 2)부터 (3, 4)까지 합을 구하면 3+4+5+4+5+6 = 27이고, (4, 4)부터 (4, 4)까지 합을 구하면 7이다.표에 채워져 있는 수와 합을 구하는 연산이 주어졌을 때, 이를 처리하는 프로그램을 작성하시오.입력첫째 줄에 표의 크기 N과 합을 구해야 하는 횟수 M이 주어진다. (1 ≤ N ≤ 1024, 1 ≤ M ≤ 100,000)..
2024.06.23
-
[백준] 구간 합 구하기 4
문제 주소https://www.acmicpc.net/problem/11659문제 설명수 N개가 주어졌을 때, i번째 수부터 j번째 수까지 합을 구하는 프로그램을 작성하시오.입력첫째 줄에 수의 개수 N과 합을 구해야 하는 횟수 M이 주어진다. 둘째 줄에는 N개의 수가 주어진다. 수는 1,000보다 작거나 같은 자연수이다. 셋째 줄부터 M개의 줄에는 합을 구해야 하는 구간 i와 j가 주어진다.출력총 M개의 줄에 입력으로 주어진 i번째 수부터 j번째 수까지 합을 출력한다.제한1 ≤ N ≤ 100,0001 ≤ M ≤ 100,0001 ≤ i ≤ j ≤ N예제 입력 15 35 4 3 2 11 32 45 5예제 출력 11291일단 단순하게 짜봤는데 지금 상태에서는 누적합이라는 알고리즘이 왜 따로 분리되었는지 이해가 ..
2024.06.23
-
[백준] 이전 순열
문제 주소https://www.acmicpc.net/problem/10973문제 설명1부터 N까지의 수로 이루어진 순열이 있다. 이때, 사전순으로 바로 이전에 오는 순열을 구하는 프로그램을 작성하시오.사전 순으로 가장 앞서는 순열은 오름차순으로 이루어진 순열이고, 가장 마지막에 오는 순열은 내림차순으로 이루어진 순열이다.N = 3인 경우에 사전순으로 순열을 나열하면 다음과 같다.1, 2, 31, 3, 22, 1, 32, 3, 13, 1, 23, 2, 1입력첫째 줄에 N(1 ≤ N ≤ 10,000)이 주어진다. 둘째 줄에 순열이 주어진다.출력첫째 줄에 입력으로 주어진 순열의 이전에 오는 순열을 출력한다. 만약, 사전순으로 가장 처음에 오는 순열인 경우에는 -1을 출력한다.예제 입력 141 2 3 4예제 출..
2024.06.21
-
[백준] 다음 순열
문제 주소https://www.acmicpc.net/problem/10972문제 설명1부터 N까지의 수로 이루어진 순열이 있다. 이때, 사전순으로 다음에 오는 순열을 구하는 프로그램을 작성하시오.사전 순으로 가장 앞서는 순열은 오름차순으로 이루어진 순열이고, 가장 마지막에 오는 순열은 내림차순으로 이루어진 순열이다.N = 3인 경우에 사전순으로 순열을 나열하면 다음과 같다.1, 2, 31, 3, 22, 1, 32, 3, 13, 1, 23, 2, 1입력첫째 줄에 N(1 ≤ N ≤ 10,000)이 주어진다. 둘째 줄에 순열이 주어진다.출력첫째 줄에 입력으로 주어진 순열의 다음에 오는 순열을 출력한다. 만약, 사전순으로 마지막에 오는 순열인 경우에는 -1을 출력한다.예제 입력 141 2 3 4예제 출력 11 ..
2024.06.21