일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- hyperledger
- c#
- MongoDB
- smart cast
- SQL
- gradle
- 운영체제
- 자바 프로젝트
- dynamic query
- oracle
- 티스토리
- JVM
- 학점
- 자바
- 파이썬 소스
- 문법 정리
- 리눅스
- 오라클 디비
- auto configure
- spring
- 프로젝트
- 파이썬
- 오라클
- jsp
- 유사코드
- 알고리즘
- resilience4j
- 백준 알고리즘
- 초대장
- K6
- Today
- Total
목록Programming (154)
모종닷컴
최근 들어 소수점을 다루는 일들이 종종 생깁니다. 그리고 이 소수점들을 이용해 연산을 할 때가 많은데 그러다 보니 소수점 관련 문제들을 마주하게 되면서 BigDecimal을 사용하게 되었습니다. 일단 소수점을 이용해 연산할 때 생기는 문제들에 대해서 살펴보도록 하죠. 소수점 + 소수점 = ? 간단하게 테스트 코드를 만들고 이를 실행시켜보도록 하겠습니다. class DecimalTest { @Test fun `소수점 더하기 테스트`() { val a = 10.1 val b = 9.2 val c = a + b print(c) Assert.assertTrue(c == 19.3) } } 위의 코드를 실행시키기 전 우리는 코드만 봤을 때는 전혀 문제가 없는 것처럼 보입니다. 하지만 실제로 이 코드를 실행해보면 아..
스프링 시큐리티의 PreAuthorize를 사용하다가 조심해야 할 부분인 것 같아 글로 적어봅니다. Gradle + Kotlin + Spring Boot + Spring Security 조합으로 프로젝트를 구성하였는데 이 구성을 블로그 글에 하나씩 올리자니 너무 내용이 길어지는 것 같아 전부 설명하지 않고 일부분만 코드를 올리도록 하겠습니다. Gradle Dependency 추가 implementation "org.springframework.boot:spring-boot-starter-security" Security Configure @Configuration @EnableWebSecurity @EnableGlobalMethodSecurity(prePostEnabled = true) class Sec..
InnoDB 스토리지 엔진 아키텍처 InnoDB는 MySQL에서 사용할 수 있는 스토리지 엔진 중 거의 유일하게 레코드 기반의 잠금을 제공해서 높은 동시성 처리가 가능한 스토리지 엔진입니다. InnoDB의 특징들을 하나씩 알아보도록 하겠습니다. Primary Key 클러스터링 InnoDB의 모든 테이블은 기본적으로 프라이머리 키를 기준으로 클러스터링되어 디스크에 저장됩니다. 프라이머리 키 외에 세컨더리 인덱스가 존재하는데 이곳에는 레코드의 주소(디스크의 데이터 위치)가 아닌 프라이머리 키의 값을 논리적인 주소로 사용합니다. 따라서 디스크는 프라이머리 키 기준으로 저장되어 있어 프라이머리 키를 이용한 레인지 스캔은 상당히 빨리 처리될 수 있습니다. Foreign Key 지원 외래 키에 대한 지원은 Inno..
오늘의 주제는 테스트 코드를 적절하게 이용해서 버그를 예방하기입니다. (물론 아닐 수도 있지만..) 대개 테스트 코드를 작성하는 이유는 지속적으로 내가 만든 코드가 정상 동작하는지를 체크하기 위함일 겁니다. 하지만 이 외에도 테스트 코드는 정말 유용하게 사용할 수 있습니다. 제약을 테스트 코드로 예시를 좀 들어보겠습니다. A 서버에는 Food라는 Enum 클래스가 존재합니다. B 서버에서는 A 서버의 이넘 클래스 정보를 가져와 외부에 등록을 한다고 합니다. 이때 외부에 등록하는 것이다 보니 사이즈나 길이 등의 제약이 존재하게 되었습니다. 최대 10자까지 등록할 수 있다고 하네요. 이러한 상황을 알고 있는 개발자가 Food안에 있는 Enum 값을 모두 10자리 미만으로 만들도록 하였고 주석도 잘 달아주었습..
AOP 주요 용어 알아보자. 용어 의미 Joinpoint Advice를 적용 가능한 지점을 의미. 메서드 호출, 필드 값 변경 등이 Joinpoint에 해당 Pointcut Joinpoint의 부분 집합으로서 실제로 Advice가 적용되는 Joinpoint를 나타낸다. Advice 언제 공통 관심 기능을 핵심 로직에 적용할 지를 정의하고 있다. ex) 메서드 호출 전, 후 Weaving Advice를 핵심 로직 코드에 적용하는 것을 weaving이라고 한다. 코드를 핵심 로직 코드에 삽입하는 것이 weaving Aspect 여러 객체에 공통으로 적용되는 기능을 Aspect라고 한다. Spring AOP와 AspectJ의 목표는 다르다. Spring AOP는 프로그래머가 직면하는 가장 일반적인 문제를 해결..
쿼리 파서 요청으로 들어온 쿼리 문장을 토큰(MySQL이 인식할 수 있는 최소 단위의 어휘나 기호)으로 분리해 트리 형태의 구조로 만든다. 쿼리 문장의 기본 문법 오류는 이 과정에서 발견 전처리기 각 토큰을 테이블 이름이나 칼럼 이름, 또는 내장 함수와 같은 개체를 매핑해 해당 객체의 존재 여부와 객체의 접근 권한 등을 확인하는 과정 옵티마이저 사용자의 요청으로 들어온 쿼리 문장을 저렴한 비용으로 가장 빠르게 처리할지를 결정 DBMS의 두뇌에 해당 실행 엔진 만들어진 계획대로 각 핸들러에게 요청해서 받은 결과를 또 다른 핸들러 요청의 입력으로 연결하는 역할 수행 옵티마이저가 두뇌라면 실행 엔진은 손과 발 핸들러 (스토리지 엔진) MySQL 서버의 가장 밑단에서 MySQL 실행 엔진의 요청에 따라 데이터를..
운영에서 개발을 하다 보면 팀 혹은 개발 그룹에서 코딩 컨벤션이 생길 겁니다. 예를 들어 저희 회사에서는 assert 함수를 사용하지 말고 required 함수를 사용하자는 코딩 컨벤션이 생겼는데요. 저희는 사람인지라 어느 순간 이런 컨벤션을 까먹게 됩니다. 또한 실수로 assert 함수를 썼지만 리뷰어 조차도 기억이 안 나서 그냥 이 코드가 통과가 되는 경우가 있죠.. (죄송합니다 접니다.) 이런 인간(?)의 실수를 어떻게 하면 줄일 수 있을까 하다 알게 된 것이 바로 Intellij의 Inspection입니다. Intellij Code Inspection이 뭘까요? IntelliJ IDEA에는 프로젝트를 컴파일하기 전에 비정상적인 코드를 감지하고 수정하는 일련의 코드 검사가 있습니다. IDE는 다양한..
플러그인 스토리지 엔진 모델 MySQL에서 쿼리가 실행되는 과정을 본다면 거의 대부분의 작업이 MySQL 엔진에서 처리되고, 마지막 '데이터 읽기/쓰기' 작업만 스토리지 엔진에 의해 처리된다. MySQL 에는 이미 기본적으로 많은 스토리지 엔진을 지니고 있다. 하지만 수많은 사용자의 요구 조건을 만족시키기 위해 기본적으로 제공되는 스토리지 엔진 이외에 부가적인 기능을 더 제공하는 스토리지 엔진이 필요할 수 있기에, 사용자가 직접 스토리지 엔진을 개발하는 것(=플러그인)도 가능하다. 플러그인해서 사용할 수 있는 것이 스토리지 엔진만은 아니다. 검색어 파서도 플러그인 형태로 개발해서 사용할 수 있으며, 사용자의 인증을 위한 플러그인도 있다. 모든 쿼리 작업에 스토리지 엔진 모델이 적용되지는 않는다. MySQ..
MySQL에서 사용되는 메모리 공간은 글로벌 메모리 영역과 로컬 메모리 영역으로 구분할 수 있다. 글로벌 메모리 영역의 모든 메모리 공간은 MySQL 서버가 시작되면서 운영체제로부터 할당된다. 운영체제에 따라 100퍼센트 할당해 줄 수도 있고, 공간을 예약만 해두고 필요할 때 조금씩 할당할 수도 있다. 글로벌 메모리 영역 글로벌 메모리 영역은 아래와 같이 이루어져 있다. 테이블 캐시 InnoDB 버퍼 풀 InnoDB 어댑티브 해시 인덱스 InnoDB 리두 로그 버퍼 클라이언트 스레드의 수와 무관하게 하나의 메모리 공간만 할당된다. 필요에 따라 2개 이상의 메모리 공간을 할당받을 수도 있지만, 클라이언트의 스레드 수와는 무관하며, 생성된 글로벌 영역이 N개라도 모든 스레드에 공유된다. 로컬 메모리 영역 로..
제가 다니고 있는 회사에서는 Flyway를 이용하여 테이블의 버전(?)을 관리하고 있습니다. 어플리케이션 내에 테이블의 수정 쿼리를 .sql 파일로 만들고 운영에 배포를 하면 flyway가 이 sql 파일을 데이터베이스에 대신 실행을 해줍니다. 예를 들어 테이블에 필요없는 컬럼이 존재하여 삭제를 해야 한다면 아래와 같은 sql을 만들고 배포를 하면 어플리케이션이 시작하는 타이밍에 flyway가 데이터베이스에 해당 sql 파일을 실행시켜줍니다. ALTER TABLE test DROP COLUMN unused_col; 설명은 간단히 이정도로 마치고 실제 겪었던 이슈를 설명하도록 하겠습니다. 엔티티 명세와 테이블 명세가 달라요. 저희 회사에서는 현재 JPA를 사용하고 있어서 Entity 클래스가 따로 존재합니..