전체 글 29

[Dev] 프로세스 메모리 할당과 JVM

🍎 저수준에서 힙영역 메모리 할당에 관하여 알아보고 운영체제의 상을 차용한 JVM 에선 어떤 차이가 있는지 알아보는 글입니다.(저수준의 언어 == C언어)🍏 프로세스 주소 공간과 구성 요소의 역할- 프로세스의 주소 공간은 위 이미지와 같이 구성되며, 코드 영역은 낮은 주소부터 시작하고, 스택 영역은 높은 주소부터 하향식으로 동적으로 확장됩니다. Code Area(코드 영역)프로세스의 주소 공간의 코드 영역에는 프로그래머가 작성한 코드, 더 정확하게는 컴파일한 후 생성된 실행 가능한 명령어가 저장됩니다. 스레드가 공유하는 영역이며 프로그램이 실행되는 동안은 코드를 수정할 방법이 없으므로 스레드 안전 문제가 발생하지 않습니다.Data Area(데이터 영역)데이터 영역은 전역 변수가 저장되는 곳입니다..

Dev 2024.11.12

[Dev] 서버 클라이언트 사이 버전을 관리하는 방법

🍎 상황 설명- 서비스 리뉴얼의 기반이 아직 완전히 준비되지 않은 상황 (예: 사용자 DB 설계, 인증 시스템)에서 요구사항 할당- 현재 제공 중인 서비스를 유지하면서도 사용자에게 새로운 기능을 제공해야 하므로, 레거시 시스템을 기반으로 API를 개발.- 서비스의 기반이 완성된 이후, 개발팀 내부 의견 조율을 거쳐 기존 기능을 개선하고 리팩터링 하기로 결정.- 결과적으로, 레거시 버전과 개선된 버전을 어떻게 관리할 것인가에 대한 문제를 인식하게 됨.🤔 버전관리를 문제로 인식한 이유- 한 번 정해지고 서비스에 반영이 된다면 되돌리기 매우 어렵기 때문입니다.- 리소스로 버전을 관리한다고 가정해 보겠습니다.- 리소스로 버전을 관리하고자 정했으니 클라이언트에서 서버에 요청을 보낼 때 반드시 두 개의 En..

Dev 2024.10.16

Enum을 사용할 때 생각해봐야할 점

🍎 Enum을 "잘" 사용하는 나름의 방법을 예를 통해 정리한 글입니다.🍏 Enum에 관한 정의- Wiki에서 정의한 열거형(Enumeration) 타입은 멤버라 불리는 명명된 값의 집합을 이루는 자료형입니다. 열거자 이름들은 일반적으로 해당 언어의 상수 역할을 하는 식별자입니다. - 위의 내용을 풀어 설명하면, 열거형은 여러 이름이 있는 값들을 하나의 그룹으로 묶은 자료형을 뜻하고 여기서 각각의 값은 ‘멤버’라고 하며, Enum Class는 이러한 멤버들을 정의하는 클래스입니다.e.g) 일주일을 나타낼 때, '월, 화, 수, 목, 금, 토, 일'과 같이 이름을 붙인 값들을 열거형으로 정의할 수 있습니다.📝 생각해 볼 것✓ 어떤 값을 Enum으로 사용해야 할까? 1. 동일한 위상의 값Enum의 멤..

Dev 2024.09.26

Spring @Value를 통해 환경 변수를 주입받을 때 주의할 점

🍎 Spring에서 제공하는 @Value 사용 시 주의해야 할 점을 정리합니다.📝 Kotlin - Spring 환경에서 @Value를 사용할 때 마주한 문제1. @Value로 주입받을 변수를 선언하는 방법- @Value를 주입받기 위해선 app.name 이 application.yml 파일에 정의되어 있다는 가정 하에 아래 두 방식을 사용해 정의될 수 있습니다.// case 01@Value("\${app.name}")val appName: String = "A"// case 02@Value("\${app.name}")lateinit var appName: String// application.yml fileapp: name: abc- case 01의 경우, var를 사용할 때 lateinit을 사용..

Dev 2024.09.16

DB CRUD 작업의 비용 분석

🍎 애플리케이션 개발에서 흔히 당연시되는 영속 계층(RDB)의 CRUD 작업에 대해 더 깊이 이해하고 싶어, 그 비용과 효율성에 대해 정리한 글입니다.❗️ CRUD 작업의 효율성을 논하기 전에, ‘Create’와 ‘Read’가 각각 ‘Insert’와 ‘Select’와 어떻게 다른지 정리해 보겠습니다. 단어가 갖고 있는 의미를 명확하게 정의해 혼란을 없애기 위함입니다.‘Create’와 ‘Read’는 데이터 조작의 추상적인 개념을 나타냅니다.‘Insert’와 ‘Select’는 추상적인 개념을 SQL 명령어로 구체화한 것입니다.- 이 후 글의 진행에선 구체화한 명령어인 SQL의 ‘Insert‘와 ‘Select‘를 사용하겠습니다.(참고로 Update와 Delete 역시 마찬가지입니다. 쓰인 단어의 모양이 동일..

Dev 2024.09.15

[Tip]비즈니스 로직은 무엇인가요?

🍎 현업에서 일하기 전 서버 개발을 공부할 때 주변에서 들려왔지만 정의가 되지 않아 멀게만 느껴졌던 비즈니스 로직에 대해 정의합니다. 🍏 비즈니스 로직이란비즈니스 로직이란 개발하고 있는 서비스(애플리케이션) 내부에서만 사용되는 로직을 의미합니다. - 클라이언트 레벨에서 애플리케이션이 실행되는 동안 발생하는 이벤트를 기록하는 로깅 프로세스는 애플리케이션의 특정 요구사항을 처리하는 로직이 아닙니다. 이는 애플리케이션이 정상적으로 동작하기 위해 필요한 기본적이고 기술적인 기능을 처리하는 General 한 로직입니다. - 비즈니스 로직은 특정 도메인의 애플리케이션이 특정 비즈니스 요구 사항을 처리하는 로직으로 애플리케이션의 기능과 관련된 규칙 그리고 절차를 정의합니다.- 예를 들면 온라인 쇼핑몰의 주문 처리..

TIL 2024.09.05

시간값 발행 주체는 누가 되어야 하는가?

🍎 개발에 있어 시간 값을 정확하게 다루는 것은 아무리 강조해도 지나치지 않습니다.- 한 예로 시간 값을 정확하게 관리하지 않으면 데이터의 일관성을 유지하기 어려워질 수 있고 이는 예상치 못한 상황을 발생시키거나 시스템의 신뢰성을 저하시킬 수 있습니다.🍎 상황- 포춘 쿠키 이벤트 요구 사항을 해결하는 중 "하루 한 번의 포춘 쿠키 메시지만 얻을 수 있다"는 세부 요구사항을 해결하기 위해 Application Layer에서 Instant.now()를 사용해 시간값을 발행해 사용 💭 생각하게 된 이유- 위와 같이 Application Layer에서 시간값을 발행한 이유는 아래 두 이유 존재시간값을 외부에서 주입해 사용함으로 시간값이 포함된 로직 테스트 가능하다고 판단23:59:59에 발생한 API가 D..

Dev 2024.09.03

[설계] 순서 결정의 책임을 결정하는 방법

🍎 클라이언트와 서버 간 데이터를 주고받을 때, 데이터 순서 정렬이 필요한 상황에서 고려할 사항들을 정리합니다.🍏 상황 설명- Json Format으로 조회한 제품 리스트의 순서 정렬에 관한 요구사항을 해결 중 정렬의 관한 책임을 서버에 두기로 생각- 생각의 근거는 순서를 정렬하는 것이 비즈니스 로직에 포함되어야 한다고 판단했고 클라이언트에선 서버에 요청값을{ “order” : “ASCENDING” }- 위와 같이 넘겨 정렬이 완료된 값만 받아오는 것이 합리적이라고 생각📝 놓친 부분- 첫 번째 이유는 서버가 정렬하는 것이 비즈니스 로직이라고 판단했는데 이를 잘못 판단비즈니스 로직이라는 것은 운영하는 서비스 내부에 존재하며 다른 도메인(혹은 서비스)에선 적용되지 않은 로직"정렬" 기능은 내가 속한 조..

Dev 2024.09.03

[설계] 설계 시 우선되어야 할 계층 구조에 대하여

🍎 패키지 계층 구조와 클래스 계층 구조 중 어느 것을 우선으로 생각해야 하는지 정리합니다.- 애플리케이션 요구사항을 받아 코드 작성에 들어가기 전에, 당연하게 생각했던 개발팀 내부의 패키지 계층 구조와 클래스 계층 구조를 다시금 낯설게 바라보게 되었습니다.- 패키지 계층 구조가 아직 정해지지 않은 상황, 즉 백지 상태에서 설계를 시작해야 할 때, 무엇을 우선적으로 고려해야 할지 고민해 보았습니다.🍏 결론- 결론부터 이야기하자면 패키지 계층 구조 설계보다 클래스 계층 구조 설계가 먼저 선행되어야 하는 것이 좋습니다.- 이유는 하나의 패키지 안에 관계를 맺고 있는 클래스들이 존재한다 하더라도 클래스의 계층 구조는 깨지지 않습니다.- 패키지 계층 구조는 단지 클래스들을 보다 보기 쉽게 계층을 나눠 구성하..

Dev 2024.09.03

[Kotlin] reified, inline 그리고 Generic

🍎 Kotlin에서 제공하는 `reified`, `inline` 키워드의 기능을 정리합니다. 키워드들이 무엇인지, 그리고 어떤 상황에서 사용되는지 알아보겠습니다.🍎 `reified`와 `inline`의 사전적 의미- `reified`는 reify의 과거형으로 사전적 의미로 "개념이나 아이디어를 구체적이고 실질적인 형태로 변환하다"라는 의미를 갖습니다.- `inline`은 "줄지어 있는, 일렬로 나란히 있는"을 의미하며 컴퓨터 용어로는 코드를 다른 코드 내에 직접 삽입하는 방식을 의미합니다.🍏 예를 통한 `refied` 이해 - `reified`를 알기 위해선 우선 `inline` 키워드를 알아야 합니다.fun printYourName(operation: () -> Any) { println(..

Dev 2024.09.03