dev 136

AhnLab Safe Transaction + VSCode로 .Net프로젝트 Open시 충돌현상

갑자기 AhnLab Safe Transaction에서 Execution/MDP.Powershell.M1185 발생 V3설치 후 PC 전체검사 수행했으나, 이상 무하지만, 지속 발생 원인 및 발생하는 상황은VSCode실행시 .Net 다운로드 Task가 동작할때 발생함프로세스 종료로 인해, .Net 지원이 제대로 안됨악성코드가 아닌데, 악성코드로 인식하는것 같다.황당 조치 검사 예외 설정함C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe

dev/etc 2026.03.13

엔터프라이즈 ORM과 1차캐시

DB CRUD 작업을 쿼리없이 ORM을 처리하면 참 편리한데,여러 언어들과 다양한 ORM들의 차이를 이해하지 못하면, 난감한 상황이 발생하곤 한다.기본적인 ORM의 뜻대로, 객체와 매핑이 되는건 동일하지만동적 타입 언어들과 정적 타입 언어들은 확실히 다르다. 난감한 상황으로써, ORM의 1차캐시에 대해 알아보자. Java진영의 JPA를 예로 들면, Persistence Context (Enitity Manager) 에서 1차캐시를 관리한다.같은 객체를 한번만 조회하고, 이후에는 캐시에서 읽는 효율적인 쿼리동작을 가능하게 한다.1차캐시를 기반으로, CRUD가 즉시 실행되지 않는 형태가 많다. (장점이자 단점인 부분) 전제>> 1차 캐시는 "트랜잭션 범위 메모리 캐시"이다. DB와 동기화되기 전까지는 메모리..

dev/database 2026.02.24

C# ConfigureAwait 이해

C#의 비동기 처리는 아주 사용자 친화적으로 구성되어편리하게 Task + async/await로 구성할 수 있다. 사실 내부 비동기 매커니즘은 복잡한데,SynchronizationContext와 Managed Thread Pool 등등 살펴볼 필요가 있다. 이글의 목적은 ConfigureAwait 를 이해하는것이다. 대략 적인 사용법은await SomeTask().ConfigureAwait(false); 같은 방식인데, ConfigureAwait의 역할은 무엇인가?? ConfigureAwait(false)“원래 컨텍스트로 돌아오지 말고 아무 데서나(대개 ThreadPool) 이어서 실행해도 됨”라이브러리 코드에서 데드락 방지/성능에 유리한 경우가 많음UI 업데이트가 필요하면 false 쓰면 안 됨(돌아올..

dev 2026.01.15

MariaDB 트랜잭션 사용시 고려사항

트랜잭션 설계시, 주의, 고려 해봄직한 내용 Java기준, 멀티쓰레드 + 커넥션 풀 환경이라면, 단일 서버 + 단일 DB 환경일지라도, 동시성 제어가 필요한 환경이다. 데이터 유실, 업데이트 누락, Read -> Write 불일치 등등 반드시, 트랜잭션 + 잠금이 필요하다. START TRANSACTION을 해주더라도, 원자성을 보장해주다는 개념이지, 동시성 제어와는 무관하다. 위험한 방법 1START TRANSACTION;SELECT gold FROM player WHERE account_id=?; -- 그냥 읽기-- 애플리케이션에서 계산UPDATE player SET gold=? WHERE account_id=?;COMMIT;전형적인 “SELECT→비즈니스 계산→UPDATE”다른 트랜잭션이 중간에..

dev/database 2025.12.26

.net string.GetHashCode() 그리고 Unity

string.GetHashCode() 메소드는 프레임워크 버전 별로 구현이 다르다. .NET Core 3.1 / .NET 6.0이상에서는 프로그램 실행시마다, 값이 바뀜 (not unique), 고유값으로 사용할 수가 없다. 하지만,.NET Framework 4.7.2같은 구 버전에는 항상 값이 동일하다. hash code가 같다고 string.Equals는 아니겠지만, 충분히 고유값으로 사용이 가능하다. Unity 6기준, scriptingBackend나 apiCompatibilityLevel에 관계없이 같은 값을 가진다.

dev/unity3d 2025.03.27

http 통신시 중복 로그인을 방지하는 방법 고찰.

기본적인 중복 로그인 방지 방법사용자의 마지막 로그인 정보 저장 사용자가 로그인할 때마다 마지막 로그인 시간 및 기기 정보를 저장 새로운 로그인 요청이 오면 기존 세션을 만료기존 세션 강제 종료 동일한 계정으로 로그인할 경우 기존 세션을 삭제 새 로그인만 허용하고 이전 세션을 무효화Redis 또는 In-Memory 캐시 사용 로그인된 사용자의 세션을 Redis에 저장하고 관리 중복 로그인 요청이 오면 이전 세션을 삭제서버에서 세션을 만료,삭제,무효화 시키면, 해당 세션을 사용하는 클라이언트는 로그아웃 된것으로 간주됨. 로그인 시점에 서버에서 관리되는 세션을 핸들링 해주는것이 핵심. 브라우저에서 Cookie를 사용하여, 세션 처리되는 방식처럼,API에서도 비슷한 구현이 필요한 상황이다. 구현 시나리오 1 ..

dev/web 2025.02.13

stateless 인증과 jwt, 그리고 위변조에 대한 이야기

항상 개발을 하다보면, 인증 처리 방식에 대한 고민이 많다. 모바일이 보편화 되고, SPA 웹앱으로 개발하는 일도 많다보니, 세션을 사용하는 일은 거의 없다. 대세의 jwt를 쓰면서도, 자유롭게 설정 가능한 payload는 가끔 또 고민의 고민을 낳고 있다. 그렇게 사용하게 된 jwt의 장,단점에 대해 이야기를 해본다. stateless 인증으로 jwt를 채택하여 얻게 되는 장점은 많다.서버사이드 세션관리가 필요없으므로, scale-out하기에 용이하다.단순하고 직관적이면서도, 위변조는 안된다. 하지만 , payload가 노출은 되므로, 신경 쓸 부분이 많다.예를 들어 payload에 중요한 정보를 넣어서는 안되고탈취에는 취약하므로, 방지책도 고려해야 한다. 또한, Issuer나 Audience, Iat..

dev/web 2024.11.08

user sudo 그룹 추가 및 sudo 커맨드 비밀번호 없이 사용하기

1. user  sudo 그룹에 추가usermod -aG sudo [USERNAME] 2. sudo 커맨드 사용시 비밀번호 입력 미사용(sudoers 파일은 readonly 라서, 수정이 불가능한 경우, 파일 속성을 변경하는 방법도 있으나 권장하지 않음)더보기# vi /etc/sudoersvisudo # 맨 하단에 추가 권장 - `%sudo ALL:(ALL) ALL` 보다 밑에 추가해야 값이 override 안됨[USERNAME] ALL=(ALL:ALL) NOPASSWD: ALL 3. 해당 계정에서 sudo 확인

dev/linux 2023.12.04

Docker Compose 설치 (Ubuntu 22.04)

## 선행 도커설치 필요함 ## # 설치할 디렉토리 생성 sudo mkdir -p /usr/local/lib/docker/cli-plugins # 바이너리 다운로드 sudo curl -L https://github.com/docker/compose/releases/latest/download/docker-compose-$(uname -s)-$(uname -m) -o /usr/local/lib/docker/cli-plugins/docker-compose # 실행권한 부여 sudo chmod +x /usr/local/lib/docker/cli-plugins/docker-compose # 심볼릭 링크 생성 sudo ln -s /usr/local/lib/docker/cli-plugins/docker-compos..

dev/linux 2023.12.04

[javascript] for ... in VS Object.keys()

자바스크립트 객체 루프하는 방법의 차이를 알아보자. var par = { prop1: "some val", someMethod: () => "value" }; var obj = Object.create(par); obj.prop2 = "some other val"; // obj prototype은 par console.log(Object.getPrototypeOf(obj) === par); // true // 상속된 prototype의 property까지 탐색 for (const key in obj) { console.log("Key: ", key, "Value: ", obj[key]); } // "Key: ", "prop2", "Value: ", "some other val" // "Key: ", "p..

dev/web 2023.05.09