Language \ Framework 10

[Android] ViewModel 간단 정리

1. ViewModel의 역할ViewModel은 화면의 상태(State)를 관리하는 역할을 합니다.UI에 필요한 비즈니스 로직을 ViewModel에서 처리함으로써,UI 코드와 비즈니스 로직을 명확하게 분리할 수 있습니다.또한 ViewModel은 화면 구성 변경(예: 가로/세로 회전) 이 발생하더라도데이터를 유지할 수 있기 때문에 안정적인 화면 상태 관리를 가능하게 합니다. 2. remember / rememberSaveableremember와 rememberSaveable을 사용해도 상태 관리는 가능합니다.두 API 모두 상태를 기억한다는 공통점이 있지만, 동작 방식에는 차이가 있습니다.항목구성 변경(회전 등) 시 값 유지직렬화 필요비고항목구성 변경 시 값 유지 상태직렬화 필요비고remember❌ 초기화..

[Android] Jetpack Compose - Navigation

먼저 Navigation을 설명하기 전에,Jetpack Compose의 화면 전환에 대한 이해가 조금 필요하다.Compose는 Activity가 하나만 있고, Single Activity안에서 Navigation을 통해 화면을 전환한다.화면은 @Composable 함수로 구현되고 갱신은 Recomposition을 통해 이루어진다. 상태는 ViewModel, State로 관리한다.blue book Recomposition은 상태가 변경될 때, UI 갱신하는 것을 의미한다.다른 웹프레임워크 처럼, 상태변수 값이 변경 되면, 관련 된 UI가 갱신 된다.사용법먼저 build.gradle.kt(app) > dependencies에 다음을 추가해준다 implementation("androidx.navigation:..

[Android] Jetpack Compose 기본 컴포넌트

1. ScaffoldScaffold는 화면의 기본 레이아웃을 담당한다.아래와 같이 사용 가능하다.내용에 보면 innerPadding 이라는 Scaffold에서 자체적으로 넘겨주는 파라미터가 있다.PaddingValues 타입의 값을 넘겨주는데, 기기 상단(푸시아이콘, 시간 등)과 하단의 공간 Padding 값이다.이 값을 사용하지 않으면, 상단과 하단의 공간까지 전체를 차지하여 표시한다.@Composablefun ScaffoldTemplate() { Scaffold( contentWindowInsets = WindowInsets.safeDrawing, topBar = { TopAppBar( title = { Text("타이틀") }, ) },..

[Kotlin] 기본 문법 예제

1. 함수fun helloWorld(): Unit { // Unit -> void 와 같음. println("Hello World") } fun add(a: Int, b: Int): Int { return a + b } // 아래처럼 축약 가능 fun add(a: Int, b: Int): Int = a + b 2. 변수기본적으로 val, var 변수가 있다.타입 뒤에 ?를 붙여서 nullable 여부도 지정이 가능하다.Nullable, NonNull에 대해서는 다른 글에서 설명fun hi() { val a: Int = 10 // val은 변할 수 없음 - 상수 var b: Int = 10 // var은 재대입 가능 val c = 100 // type은 써주지 않아도 상관없음 - ..

[Kotlin] 기본 문법 비교 (vs Java)

1. 기본 문법 비교(vs Java) 항목JavaKotlin비고클래스 정의public class Person {}class Person접근제한자 기본값: Java=default, Kotlin=public변수 선언int a = 10;val a = 10 (불변), var a = 10 (가변)Null 안전성String s = null; (가능)var s: String? = null? 붙여야 null 허용. 컴파일러가 NPE 방지문자열 템플릿"Hello " + name"Hello $name" 또는 "Hello ${user.name}"조건문if(...) { ... } else { ... }동일, 하지만 표현식 가능: val max = if (a > b) a else bKotlin은 값 반환 가능삼항 연산자int ..

SOLID 원칙

시작작년에 회사에 입사를 하고, 이번에 추가 기능에 대한 프로젝트를 하나 맡았는데, 기존 구조나 코드가 조금 복잡한 감이 없지 않았다.개발 진행 중에, CTO님도 이 부분에 대한 문제를 기존부터 염두에 두고 계셔서, 이 참에 조금 대대적인 리팩토링을 하기로 했다.기존 로직을 건드리는 것이 어떻게 보면 조금 위험하긴 하다보니, 여태 이렇게 운영이 된 것 같다. 그런데, 하다보니 어떤식으로 리팩토링 하는 것이 좋은지에 대한 고민이 항상 있다보니 가끔은 머리가 아프기도 했다.개발을 하다보면 불필요한 로직이나 코드, 혹은 어느 한줄만 없어지면 다음 로직이 조금 간단해질 수 있는 여지가 있는 코드 등등 뭔가 조금 거슬리는 코드 들이 있는데, 이런 부분들을 좋게 개선하려다 보니 SOLID 원칙이 생각이 났다.생각이..

[JAVA] ReentrantLock, ReentrantReadWriteLock

1. 개념동시성을 제어할 수 있는 객체.synchronized 와 유사하나, 더 세밀한 제어와 확장된 기능을 제공함.2. 차이점ReentrantLock은 단일 잠금을 제공하고, ReentrantReadWriteLock의 경우는 읽기와 쓰기의 잠금을 별도로 관리할 수 있음.ReentrantLock은 선택적으로 공정한 잠금정책을 제공할 수 있지만, ReentrantReadWriteLock은 지원하지 않음.읽기 작업이 많은 경우, ReentrantReadWriteLock이 더 나은 성능을 보여줌.재진입의 의미!ReentrantLock에서 '재진입’이란 이미 특정 스레드에 의해 잠금이 획득된 상태에서 같은 스레드가 다시 그 잠금을 획득하는 것을 의미.3. ReentrantLockReentrantLock lock..

[JAVA] CompletableFuture

1. 개념자바에서 비동기 프로그래밍을 가능하게 하는 클래스.기존 Future 라는 인터페이스를 Implements📓 사용 이유자바에서 비동기 프로그래밍을 사용해야 하는 상황에 해당 클래스를 사용한다.그리고 Future라는 인터페이스가 있으나, 반드시 예외 처리를 해줘야 하는 부분이 있고,get() 함수를 사용하거나, 타임아웃을 걸어주기 전까지는 다른 작업을 할 수 없다.CompletableFuture의 경우는 다양한 상황의 비동기적 프로그래밍을 할 수 있고,때에 따라서는 동기적 흐름을 만들 수 있다.예를 들어, 메소드 A와 메소드 B의 관계에서, A와 B의 반환 값이 모두 필요한 상황이라면 A와 B를 동시에 실행하고, 두개의 메소드가 전부 완료되는 시점에 반환값들을 처리할 수 있다.다른 상황으로는, A..

[Javascript] Promise, async, await

0. Promise - Promise는 비동기 처리에 사용되는 객체이다. 일반적으로 Javascript 에서 비동기 처리시에 함수내에서 Rest api 호출했을 때라던가, DB 데이터를 조회하기 위해 요청을 보냈을때, 응답이 오지않았는데도 프로세스를 끝내버려 겉으로는 정상동작으로 보이나, 실제로는 값이 반환되지 않는 경우가 종종 있다. Promise는 이 처럼 비동기 프로세스를 마치 동기 프로세스처럼 사용할 수 있는 객체이다. Promise는 다음 중 하나의 상태를 가진다. 대기(pending) : 말 그대로 대기 상태이다. Promise 객체를 console.log로 확인해보면 이라는 문구를 볼 수 있을 것이다. 이행(fulfiled) : 해당 Promise 객체가 정상적으로 처리되었음을 의미한다. 거..

[Nodejs] - Mysql 연동

0. 프로젝트 진행 중 Mysql DB를 사용할 일이 생겨서 Nodejs와 연동을 해야했다. 기존에 MS Sql만 연동되어 있어, Mysql과 연동할 라이브러리가 필요했다. 1. 먼저 npm을 통해 mysql을 설치해준다. npm install mysql 이후 datasource를 작성하여 연결한다. const mysql = require('mysql'); let pool; // mysql connect pool = mysql.createConnection({ host: 'DB HOST', user: 'user id', password: 'password', database: 'DB name' }); pool.connect(); pool.query('SELECT 1', function (error, re..