}
JWT 생성 과정→ 사용자 정보를 넣고, 서버가 가진 비밀키로 JWT를 암호화(서명)해서 만듭니다.JWT 검증 과정→ 서버는 JWT를 받으면 그 JWT가 서버가 가진 비밀키로 만들어졌는지 확인합니다.→ 이 과정에서 변조 여부와 유효성을 확인합니다.
Prisma 스키마 예시model User { id Int @id @default(autoincrement()) email String @unique name String? createdAt DateTime @default(now()) posts Post[]} 필드명 타입 설명 비고 idInt고유 ID자동 증가 (@id @default(autoincrement()))emailString이메일중복 불가 (@unique)nameString (선택적)사용자 이름선택적 필드createdAtDateTime생성된 날짜 및 시간기본값 현재시간 (@default(now()))postsPost[]사용자가 작성한 게시글과의 관계1:N 관계📌 1. 데이터 생성 ..
Prisma는 Node.js와 TypeScript 환경에서 사용하는 차세대 ORM(Object-Relational Mapper)으로, 데이터베이스 작업을 획기적으로 간단하게 만들어줍니다.ORM(Object-Relational Mapper)이란?ORM이란 객체 지향 프로그래밍 언어와 관계형 데이터베이스 간의 데이터 변환을 자동화해주는 기술입니다. 쉽게 말하면, 개발자가 직접 복잡한 SQL 쿼리를 작성하지 않고자바스크립트, 타입스크립트 같은 언어의 코드만으로 데이터베이스 작업을 할 수 있도록 도와주는 기술입니다.ORM이 없을 때, 사용자 정보를 가져오기 위해서는 아래와 같이 작성해야 합니다. // 직접 SQL 쿼리를 작성해야 함const result = await db.query('SELECT * FROM..
결론 : JWT 토큰은 무조건 서버가 만듭니다. 단계 누가 무엇을 하는가? 설명 ①클라이언트로그인 요청 (ID, PW)사용자가 서버에 로그인 시도②서버사용자 인증 (DB 확인 등)DB에서 사용자를 검증③서버JWT 생성 (Secret Key로)사용자 검증 완료 후 서버가 JWT 생성④서버 → 클라이언트JWT 전송서버가 생성한 JWT를 클라이언트에 전달⑤클라이언트JWT 저장 후 요청 시마다 전달클라이언트는 JWT를 저장했다가 매 요청 시 서버에 보냄⑥서버JWT 검증요청 받을 때마다 JWT 검증즉, 클라이언트는 서버가 만들어 준 JWT를 저장하고 있다가 요청할 때마다 서버로 전달하는 역할만 수행합니다. 직접 JWT를 생성하지 않습니다.서버의 비밀키(Secret Key)가 왜 중요할까?서버의 비밀키는 J..
LINQ란? (링크란?)LINQ는 Language Integrated Query의 줄임말로, C# 언어 안에서 SQL처럼 데이터를 다루는 문법입니다.리스트나 배열, 딕셔너리, 데이터베이스까지 다양한 컬렉션을 대상으로 사용할 수 있습니다. Where, Select, GroupBy, Any 등에 대해 간단히 설명드리겠습니다.Where – 조건에 맞는 데이터만 필터링💬 역할: LINQ에서의 Where는 모든 요소를 돌면서 조건을 만족하는 것만 추출합니다. 즉, “이런 애들만 골라줘!” 명령하는 것이지요.var activeObjs = FindObjectsOfType() .Where(obj => obj.activeSelf); Where는 루프와 if를 합친 느낌입니다obj.activeSelf == true..
시간복잡도란?시간복잡도(Time Complexity)는 입력 데이터의 크기(n)에 따라 알고리즘이 수행하는 연산량을 나타낸 것입니다.간단히 말해 "입력이 많아질수록 이 코드가 얼마나 느려질까?"를 수학적으로 표현하는 방법입니다.Big O Notation (빅오 표기법)이란?Big O 표기법은 알고리즘의 최악의 실행 시간을 나타내며, 다음과 같은 종류가 있습니다. 표기 설명 예시 O(1)상수 시간 – 입력 크기에 관계 없음배열에서 인덱스로 접근O(log n)로그 시간 – 이진 탐색처럼 반씩 줄이는 구조이진 탐색O(n)선형 시간 – 입력이 커지면 비례해서 늘어남전체 탐색O(n log n)대부분의 정렬 알고리즘 성능병합정렬, 퀵정렬O(n²)이중 반복문 등버블정렬, 삽입정렬O(2ⁿ), O(n!)매우 느림 –..
Nav Mesh를 구울 때 제외당하고 싶은 객체에 NavMesh Modifier컴포넌트를 추가해준 후, Mode에서 Remove Object를 선택해줍니다. 보너스Nav Mesh를 구울 때 굽고 싶은 객체만 지정해주는 방법은, NavMesh Modifier의 Mode를 Add or Modify Object로 설정한 후,Nav Mesh Surface컴포넌트의 Object Collection - Collect Objects를 NavMeshModifier Component Only로 바꿔주면 됩니다. 그 외 All, Volume, Current가 있는데 플젝에 맞게 선택하시면 됩니다.
프로그래밍과 그래픽스 분야에서는 데이터를 명확하고 직관적으로 표현하기 위해 종종 정규화(Normalization)를 사용합니다.그 중에서도 특히 자주 활용되는 방법 중 하나가 역정규화 패턴(Normalized Inverse Pattern)입니다. 이번 글에서는 이 역정규화 패턴의 원리를 이해하고, 실제 프로그래밍에서 어떤 방식으로 활용되는지 예시와 함께 살펴보겠습니다.역정규화 패턴이란 무엇인가? 이 수식에서 1를 빼는 이유는 항상 0에서 1 사이의 값으로 표현하고자 하기 때문입니다. 거리 기반의 사운드 크기 표현을 역정규화로 예시 들면 다음과 같습니다. 현재 거리(distance) 최대 거리(max) 볼륨 값 0 (표면에 닿음)100.05 (중간까지 눌림)100.510 (최대 눌림)101.0
멀티플레이어 네트워크 동기화에서 동작 처리와 시각 처리의 분리는 필수입니다.Fusion2는 이 목적을 위해 두 개의 핵심 메서드 FixedUpdateNetwork()와 Render()를 제공합니다. 항목 FixedUpdateNetwork() Render() 기준 시간 단위✅ Fusion Tick (고정 간격)✅ Fusion Tick (고정 간격)역할✅ 상태 계산 및 동기화 (위치, 입력 등)✅ 클라이언트 시각화 전용 (보간, 애니메이션 등)서버와 클라이언트 공유 여부✅ 서버/클라이언트 공통 동작❌ 클라이언트 전용 처리동작 주기✅ 고정 주기 실행 (Tick 단위)✅ 매 프레임 실행 (Unity Update()와 유사)보간 사용 여부❌ 계산 대상 (원본 데이터)✅ 보간된 결과 반영수정 가능 데이터✅ N..
Unity 개발 중에 에디터에서만 실행되도록 코드를 작성해야 하는 경우가 종종 있습니다.대표적으로 디버깅, 에디터 전용 API 호출이 그러한 예인데요. 이때 사용할 수 있는 두 가지 방법이 있습니다.바로 [Conditional("UNITY_EDITOR")] 특성과 전처리기 지시문 #if UNITY_EDITOR … #endif 입니다.이번 글에서는 두 방법의 동작 방식을 비교해보고, 어떤 상황에서 어떤 방식을 선택하는 것이 좋은지 알아보겠습니다. [Conditional("UNITY_EDITOR")] 특성[Conditional("UNITY_EDITOR")]는 System.Diagnostics 네임스페이스에 정의된 특성입니다.이 특성이 적용된 메서드의 호출은 컴파일 시점에 조건 심볼(여기서는 UNITY_EDI..
Interaction SDK를 사용할 때는 기본적으로 추천하는 'Rig(리그)' 구조를 사용하면 편리합니다.이번 포스팅에서는 Comprehensive Interaction Rig에 대한 특징과 장점, 그리고 설정 방법에 대해 알아보겠습니다.Comprehensive Interaction Rig란?Comprehensive Interaction Rig는 이전 버전들의 Rig 구조보다 더 발전된 형태로, 다음과 같은 장점이 있습니다.1. 모듈화(Modularity)Rig가 3가지 주요 부분으로 나누어져 있습니다.Data Sources (입력 소스)Interactions (상호작용 처리)Visuals (시각적 요소)각 모듈은 서로 독립적으로 교체할 수 있어서, 다른 플랫폼에도 쉽게 재사용할 수 있습니다.2. 간소..
VR을 개발하다 보면 한 쪽 눈에만 오브젝트 혹은 UI가 렌더링되는 경우가 종종 발생하시죠?이러한 문제들을 해결하기 위해서는 싱글 패스 인스턴스(Single Pass Instanced)라는 개념을 아셔야 합니다. 싱글 패스 인스턴스(Single Pass Instanced) 개념이 어디에 사용되냐고요?아래 사진을 보시면 VR 세팅을 하실 때 보실 수 있습니다.이번 포스팅에서는 싱글 패스 인스턴스(Single Pass Instanced)에 대해 배우진 않고, 어떻게 두 눈에 렌더링 되게 하는지 해결방법에 대해 알아보고자 합니다.싱글 패스 인스턴스(Single Pass Instanced)는 이전 포스팅을 참고해주세요. 유니티 Multi Pass와 Single Pass Instanced/Multi View에 대..
구글링을 해보면 "유니티 UPM" 등록 방법이 전부 다 이상하거나 어려운 말들로만 되어 있어서 "유니티 UPM" 설정에 꽤나 어려움을 겪었습니다... 여러 시행착오 끝에 알아낸 "유니티 UPM" 등록 방법을 아주 쉽게 공유드리겠습니다! (좋아요, 구독 !) 1. 유니티 UPM 패키지 폴더 구조 준비바탕화면이나 편한 곳에 폴더를 하나 새롭게 만들어줍니다. 폴더 구조는 아래와 같이 구성합니다. 저는 폴더 이름을 DebugUtils라고 지어주었으며 폴더 내부에는 반드시 Runtimepackage.jsonREADME.md파일들을 만들어주셔야합니다. 이때 확장자도 json이면 반드시 . 뒤에 다 삭제하시고 .json을 입력해주시고, md도 마찬가지입니다! 각 파일들은 모두 meta파일이 존재해야 하며, 만약 R..
'The file was loaded in a wrong encoding: UTF-8' 에러란?스크립트 파일을 열 때 나타나는 오류입니다. 보통 한글 주석이나 문자열이 포함된 파일을 UTF-8 인코딩으로 저장하지 않고, ANSI나 다른 인코딩으로 저장된 경우 발생합니다.해결방법스크립트 파일을 메모장이나 VS Code 등에서 열고 파일을 UTF-8 인코딩으로 다시 저장하면 해결됩니다.
유니티 6부터는 Meta XR SDK v74 이상을 사용하는 경우, OpenXR 플러그인을 활용하는 것이 권장됩니다. Meta가 OpenXR 표준을 적극적으로 지원하고 있으며, 다양한 플랫폼에서 일관된 XR 경험을 제공할 수 있도록 하기 위함입니다. XR Plugin Management for Meta QuestThis topic describes how to install XR vendor plugins using the Unity XR Plugin framework. It also explains the overall Meta XR SDKs and Unity XR Plugin framework architecture and the benefits of them.developers.meta.comUn..
CRMCRM의 주된 목적은 고객과의 상호 작용을 관리하여 고객 만족도와 충성도를 높이고, 이를 통해 매출을 증대시키는 것입니다. CRM의 목표는 고객울 관리하여 매출 증가를 증대시키는 것입니다.그러기 위해 고객 데이터 관리, 서비스 지원, 마케팅 자동화 등의 기능을 지원합니다.EMR EMR의 주된 목적은 직원과의 관계를 관리하여 내부 커뮤니케이션을 강화하고, 직원 만족도와 생산성을 향상시키는 것입니다.EMR의 목표는 직원과의 커뮤니티를 강화하여 직원 만족도와 생산성을 향상시키는 것입니다.그러기 위해 성과 관리, 복리후생 관리, 직원 데이터 관리 등의 기능을 지원합니다.
이전에 Behaviour Desinger에 대해 소개해드린적이 있습니다.아직도 종종 BD 에셋을 사용해서 AI를 구현하곤 하는데요, 간만에 정리의 필요성을 느껴서 이렇게 작성하게 되었습니다. 유니티 Behaviour Designer란?Behaviour Tree, 줄여서 BT라고 불리는 이 용어는 예전부터 들어왔었습니다. 하지만 BT의 실용성에 대해 그닥 느끼지 못했기에 지금까지 사용하지 않았지만 FSM Pattern을 직접 제작해보고 난 이후 BT의wlsdn629.tistory.comSequence 계열 (순차 실행)Task이름 설명SequenceTask를 순차적으로 실행하며, 하나라도 Fail이면 즉시 중단하고 Fail 반환Random Sequence모든 자식 작업이 성공해야 Success 반환, 하나..
렌즈 플레어(Lens Flare)를 추가하기 위해서는 두 개의 스텝을 밟으셔야 합니다.첫 번째, 라이팅 에셋에 Lens Flare (SRP)를 추가해줍니다. 두 번째, Main Camera에 Flare Layer를 추가해주시면 됩니다. Lens Flare (SRP) 옵션 정리표 옵션 설명기본값추천 설정 예제Lens Flare Data사용할 렌즈 플레어 데이터 에셋Default Lens Flare (SRP)태양, 가로등 등 각각의 환경에 맞는 Flare Data 사용Intensity렌즈 플레어의 밝기 조절1.0태양: 1.5 / 가로등: 0.8Scale렌즈 플레어의 크기 조절1.0태양: 1.2 / 가로등: 0.9Light Override특정 Light 컴포넌트와 연결없음태양, 가로등 등 특정 광원에 연결Sc..
게임 개발을 하다 보면 변수 하나 선언하는 것도 신중해야 할 때가 많습니다. 특히, 게임 데이터(ex_ HP, 경험치, 레벨 등)는 외부에서 무분별하게 변경되면 심각한 버그를 초래할 수 있습니다. 이번 글에서는 유니티에서 데이터 보호를 위한 캡슐화, 보안, 유지보수, 그리고 데이터 무결성 개념을 정리해보습니다.캡슐화란 무엇인가?캡슐화(Encapsulation)는 객체지향 프로그래밍(OOP)의 중요한 원칙 중 하나로, 데이터를 외부에서 직접 접근하지 못하게 하고, 반드시 정해진 인터페이스(메서드나 프로퍼티)를 통해서만 변경할 수 있도록 하는 기법입니다.잘못된 예시 (캡슐화 X)public class Player{ public float HP = 100; // 누구나 직접 변경 가능}// 다른 스크립..
RecenterPose()란 무엇인가?OVRManager.display.RecenterPose() 함수는 (Meta)VR 환경에서 사용자의 현재 트래킹 데이터를 기반으로 Tracking Origin을 재설정합니다. 사용자가 VR 공간에 들어서거나 예상치 못한 문제가 발생했을 때, 이 함수를 호출하면 사용자의 포지션과 방향이 초기 상태로 재조정됩니다.OVRManager.display.RecenterPose();