| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 1 | 2 | 3 | 4 | |||
| 5 | 6 | 7 | 8 | 9 | 10 | 11 |
| 12 | 13 | 14 | 15 | 16 | 17 | 18 |
| 19 | 20 | 21 | 22 | 23 | 24 | 25 |
| 26 | 27 | 28 | 29 | 30 | 31 |
- ORA-12899
- Oracle 초기 사용자
- ORA-00922
- Oracle 테이블 대소문자
- Oracle 18c 설치
- 오라클 캐릭터셋 변경
- 무료 오라클 데이터베이스
- Oracle 사용자명
- ora-01722
- Oracle 18c HR
- 오라클 캐릭터셋 확인
- Oracle 윈도우 설치
- 무료 오라클 설치
- Oracle Express Edition
- Oracle 테이블 띄어쓰기
- 비전공자를 위한 데이터베이스 입문
- Oracle 사용자명 입력
- 오라클 캐릭터셋 조회
- 서평단
- oracle
- Oracle 18c HR schema
- 윈도우 Oracle
- oracle 18c
- Orace 18c
- Today
- Total
목록Development (120)
The Nirsa Way
객체 수명과 약한 세대 가설: 힙을 세대로 나누는 이유자바의 가비지 컬렉션을 공부하다 보면 다음과 같은 용어가 반복해서 등장합니다.Eden 영역Survivor 영역Old GenerationMinor GC객체 승격힙을 여러 영역으로 나누는 이유는 객체마다 살아남는 시간이 다르기 때문입니다.어떤 객체는 생성된 직후 잠깐 사용되고 사라집니다. 반면 애플리케이션이 실행되는 동안 계속 참조되면서 오랫동안 살아남는 객체도 있습니다.public void process() { String message = "임시 메시지"; User user = userRepository.findById(1L);}위 코드에서 message처럼 메서드 내부에서 잠깐 사용하는 객체는 비교적 빠르게 필요 없어질 수 있습니다.반면 ..
핫스팟의 객체 표현과 가비지 컬렉션 루트가비지 컬렉션은 힙에 생성된 객체 중 더 이상 사용할 수 없는 객체가 차지한 메모리를 회수합니다.그렇다면 JVM은 힙에 있는 객체를 어떤 형태로 관리하고, 어떤 객체가 살아 있는지 어디서부터 확인할까요?이 질문에 답하려면 다음 두 가지를 구분해서 이해해야 합니다.객체 표현→ 힙에 생성된 객체가 어떤 구조로 저장되는가객체 탐색→ 가비지 컬렉터가 어디서부터 객체를 찾아가는가핫스팟 JVM에서는 힙의 객체를 내부적으로 OOP라는 구조를 통해 다룹니다. 객체의 앞부분에는 객체 상태와 클래스 정보를 담는 객체 헤더가 위치합니다.가비지 컬렉터는 객체 구조만 보고 생존 여부를 판단하지 않습니다. GC Root라고 부르는 시작점에서 객체 참조를 따라가며 도달 가능한 객체를 찾습니다..
가비지 컬렉션은 왜 필요한가: 활성 객체와 Mark and Sweep자바에서는 객체를 생성할 때 개발자가 직접 메모리를 할당하거나 반환하지 않습니다.User user = new User();위 코드처럼 new 키워드를 사용하면 객체가 생성되지만, C나 C++처럼 사용이 끝난 메모리를 직접 해제하는 코드는 작성하지 않습니다.이러한 메모리 관리를 대신 수행하는 기능이 가비지 컬렉션(Garbage Collection, GC)입니다.하지만 가비지 컬렉션을 단순히 “사용하지 않는 객체를 자동으로 삭제하는 기능”이라고만 이해하면 다음과 같은 의문이 생길 수 있습니다.JVM은 어떤 객체가 사용 중인지 어떻게 판단할까요?변수가 null이면 객체가 바로 제거될까요?객체끼리 서로 참조하고 있다면 계속 살아남을까요?객체가 ..
[Spring Security] BCrypt Salt의 이해: 로그인 검증이 가능한 이유와 Pepper를 고려하는 상황비밀번호 저장을 처음 구현할 때 흔히 "BCryp로 암호화해서 저장한다"라고 표현하지만 정확히는 아래와 같은 단방향 해싱 흐름입니다.[회원가입] 사용자 비밀번호 → BCrypt 해싱 → DB 저장[로그인] 사용자 입력 비밀번호 → DB의 BCrypt 해시와 비교 그런데 BCrypt를 조금 더 들여다보면 BCrypt는 매번 랜덤 Salt를 생성하므로 같은 비밀번호도 매번 다른 Hash가 나오게 됩니다. 그렇다면 로그인이 성공 가능한 이유는 무엇일지 의문이 생깁니다.이번 글은 위의 질문에서 출발하며 먼저 요약한 결론은 다음과 같습니다.1. BCrypt는 암호화가 아니라 단방향 해시다.2. B..
※ 해당 코틀린 포스트들은 기본적으로 자바를 알고 있다는 가정하에 간단히 예제만 제공하여 설명됩니다. 람다(Lambda)와 고차 함수(Higher-Order Function) 예시이번 포스팅에서는 코틀린 기준의 람다와 고차함수에 대해 정리합니다. 기본적인 개념은 람다는 이름없는 함수, 고차 함수는 매개변수 또는 반환 값이 함수인 것을 뜻합니다. 아래의 예시를 보며 람다와 고차 함수를 하나씩 확인하도록 하겠습니다. 1. 람다 예시람다의 경우 이름 없는 함수로써 아래와 같이 표현될 수 있습니다. 아래의 코드를 확인해보면 square(5)를 호출하고 있는데, (Int) 부분이 매개변수의 타입을 뜻하며 -> Int는 반환 타입을 뜻합니다.fun main() { // val 변수명: 매개변수타입 -> 반환타..
※ 해당 코틀린 포스트들은 기본적으로 자바를 알고 있다는 가정하에 간단히 예제만 제공하여 설명됩니다. 데이터 클래스, 오브젝트 클래스(data class, object class) 1. data class코틀린의 데이터 클래스는 흔히 사용하는 DTO를 생각하시면 됩니다.자바의 경우 getter, setter, equals, hashcode 등을 직접 생성하거나 롬복이라는 외부 라이브러리에 의존해야 했던 반면, 코틀린은 data class를 따로 제공하여 보다 간편하고 짧은 코드로 사용할 수 있습니다.즉 아래와 같이 data class를 선언하고 주 생성자를 작성하여야 합니다. 데이터를 담는 클래스인만큼 주 생성자에 1개 이상의 필드가 존재해야 합니다.data class User( val id: In..
※ 해당 코틀린 포스트들은 기본적으로 자바를 알고 있다는 가정하에 간단히 예제만 제공하여 설명됩니다. 코틀린의 상속과 오버라이딩코틀린의 클래스와 메서드는 기본적으로 final 입니다. 그렇기에 상속과 오버라이딩이 불가하므로 상속과 오버라이딩을 허용하기 위해서는 open을 사용해야 합니다.open class Animal { // 상속 허용 open fun sound() { // 오버라이딩 허용 println("Some generic animal sound") }} 1. 상속자바에서는 extends 키워드를 사용하여 상속을 하지만, 코틀린에서는 : 기호를 사용하여 부모 클래스를 상속 받습니다. 아래와 같이 Dog 클래스와 Cat 클래스의 뒤에 : Animal()을 붙여 Animal 클..
※ 해당 코틀린 포스트들은 기본적으로 자바를 알고 있다는 가정하에 간단히 예제만 제공하여 설명됩니다. 코틀린의 클래스와 생성자(주 생성자, 보조 생성자, init 블록)코틀린에서는 클래스와 생성자를 어떠한 방식으로 사용하는지 예제를 보며 확인해보도록 하겠습니다. 1. 클래스기본적으로 클래스를 선언하는 방식은 자바와 동일하게 class를 사용하며, 그 안에 필드와 메서드들로 구성됩니다. 필드의 선언 및 초기화는 코틀린의 문법을 따라 타입을 명시해주면 됩니다. 문법을 제외하면 여기까지는 자바와 크게 차이가 없습니다.class Person { // var : 가변 (저장된 값 수정 가능) // String : 해당 변수의 타입은 String으로 지정 var name: String = "Nirsa" ..
※ 해당 코틀린 포스트들은 기본적으로 자바를 알고 있다는 가정하에 간단히 예제만 제공하여 설명됩니다. 코틀린 기본 문법 (if, when, for, white, 함수 선언과 호출)기본 문법은 다른 언어들과 큰 차이가 없으므로 해당 포스팅에서는 간단히 예제만 보고 넘어가도록 하겠습니다. 1. ifif문은 자바와 동일 합니다. fun main() { var score = 75 if (score >= 90) { println("A 학점") } else if (score >= 80) { println("B 학점") } else { println("C 학점") }}또는 아래와 같이 조건문을 표현식으로 사용하여 변수에 저장하는 방법도 가능합니다. 조건..
※ 해당 코틀린 포스트들은 기본적으로 자바를 알고 있다는 가정하에 간단히 예제만 제공하여 설명됩니다. 코틀린이란?코틀린은 JetBrains에서 만든 JVM 언어로써 JVM 위에서 동작하기 때문에 Java와 100% 상호작용이 가능합니다. 그렇기에 코틀린에서 자바 클래스를 호출하는 방식도 가능하며 일반적인 자바와 똑같이 소스 파일(.kt) → 컴파일(Bytecode) → 클래스 파일(.class)이 생성이 됩니다.자바에 비해 간결한 코드, 불변 보장, 타입 추론 생략, Null-Safe, 함수형 프로그래밍 지원 등의 이유로 최근 코틀린을 사용하는 기업들이 많이 늘어난 추세입니다.// Kotlinfun main() { println("Hello, Kotlin!")}// Javapublic class H..
