kdhyo98의 등록된 링크

 kdhyo98로 등록된 티스토리 포스트 수는 114건입니다.

2022년 회고 副題 - 가장 오래 기억 남을 한 해 Part 1 [내부링크]

c 서론 올해는 정말 처음 경험해 보는 것들이 많았던 한 해였다. 개발자로서도 가장 많은 성장을 했던 해이자 개인적으로도 많은 경험을 할 수 있던 해였다. 그 중 개발자로서의 이야기를 한 해를 돌아보려고 한다. 개발자로서의 이야기 - 첫 회사 퇴사 - 책 집필 찍먹 - F-Lab 6개월 - 떨리는 면접 경험 - 나의 두 번째 회사 본론 c 첫 회사 퇴사 2020.10 입사하여 2022.03을 마지막으로 1년 6개월간의 첫 회사 여정을 마무리하였다. 나의 첫 회사는 SI, 솔루션 회사였다. 많은 사람들이 "SI는 갈 곳이 못 된다." "너무 힘들고, 발전도 없고, 3D업종이다."라고 많이 이야기한다. 내가 다닌 SI회사는 그래도 좋코딩에 나오는 극한의 SI는 다행히 아니었다. 2020년 나를 돌이켜보면..

[DataBase] CLI에서 쿼리할 때도 트랜잭션을 쓰자 [내부링크]

서론 실서버에 데이터를 추가, 업데이트, 삭제!!를 할 때는 살이 떨린다. 명령문을 작성하고 모니터를 바라보면서 내가 뭘 고민하는지도 모르지만 고민을 하면서 바라본다. 실수라도 하게되면.. 진짜 눈물난다.. (경험담) Spring에서 아주 쉽게 애노테이션으로 트랜잭션을 사용하지만, 왜 CLI에서 할 생각은 못했을까. 후회하면서 트랜잭션 하는 법을 정리한다.. 본론 BEGIN; /* or START TRANSACTION */ SELECT @A:=SUM(salary) FROM table1 WHERE type=1; UPDATE table2 SET summary=@A WHERE type=1; COMMIT; /* or ROLLBACK */ 끝이다. 매우 간단하다. 꼭.. 꼭 하자.. (나한테 하는 말) h..

[Spring] 그냥되는 건 없다 1 - Spring-Boot AutoConfiguration [내부링크]

서론 spring-boot 2.6.6 기준 스프링부트에서 빈 기본설정파일들을 intellij로 아무리 눌러도 불러오는 곳을 쉽게 찾지 못한 김에 정리하게 된 기본설정하는 곳. c 본론 133개의 설정파일들이 정의되어 있다. 그런데 AopAutoConfiguration, BatchAutoConfiguration과 같이 기본적으로 의존성이 추가되어 있지 않는 녀석들이 있다. @ConditionalOnProperty - property가 참일 경우 컨테이너 등록 @ConditionalOnClass - 해당 클래스가 경로에 존재할 경우 컨테이너 등록 @ConditionalOnMissingClass - 해당 클래스가 존재하지 않을 경우 컨테이너 등록 이처럼 스프링부트와 호환된다고 명시된 녀석들의 의존성을 추가..

[Spring] CaffeineCache key는 Object [내부링크]

c 본론 key가 Object이기 때문에 key를 지정할 때 타입을 신경써서 해야된다. 자칫 Integer로 지정했다가 String으로 조회하게 되면 조회가 안된다.. c 결론 개인적으로는 하나의 타입으로 통일 (ex - String)하는 게 헷갈리지 않고 좋을 것 같다.

[kotlin] kotest After/before each not working for withData [내부링크]

서론 글작성 기준 kotest version 5.5 data-driven test를 위해 withData를 사용했을 때 afterEach / beforeEach가 예상과 달리 동작하지 않았다. c 본론 간단하게 kotest의 TestType부터 살펴보고 넘어가보자면.. Type Description Container 다른 테스트를 포함할 수 있는 컨테이너 Test 중첩 테스트를 포함할 수 없는 리프 테스트 Dynamic Container, Test 둘 다 일 수 있으며, Propery test, data test와 같은 기능을 통해 테스트가 동적으로 추가될 때 사용 withData는 보다시피 TestType이 Dynamic을 사용하고 있다. 공식문서에서 나온 내용으로 살펴보자면 Dynamic은 모든 ..

[Spring] Spring의 ObjectMapper 쉽게 Custom 만들기 [내부링크]

c 서론 프로젝트를 진행하다 보면 objectMapper를 새로 만들어서 할 일이 종종 생긴다. 이때 새로 만들게 되면 Spring에서 기본적으로 제공해주는 옵션들을 찾아 동일하게 적용한 후에 내가 원하는 옵션들을 추가하고 싶을 수 있다. 어떻게 쉽게 만들 수 있을까? 본론 스프링에서 기본적으로 설정하는 properties와 기본적으로 넣어주는 모듈들이다. 이런 걸 할 때마다 일일이 찾아 설정해 주고, 반복적으로 하는 건 매우 귀찮은 일이다. 스프링에서 기본으로 제공하는 ObjectMapper를 쉽게 만드는 법은 간단하다. fun objectMapper(): ObjectMapper = Jackson2ObjectMapperBuilder().build() 위처럼 Jackson2ObjectMapperBui..

[SQL] MODIFY 시 기존 옵션 조심! [내부링크]

c 서론 MODIFY로 comment를 추가할 일이 있어서 추가를 진행했었다. 그런데, 적용 후에 확인해보니 not null -> null로 변경되었다. 본론 ALTER TABLE user MODIFY name varchar(50) COMMENT '사용자명'; 이렇게 적용하면 not null 옵션이 null로 변경된다. ALTER TABLE user MODIFY name varchar(50) not null COMMENT '사용자명'; not null이었어도 not null을 명시해주어야 null로 변경되지 않는다. null만 그러냐? 아니다. 이번엔 NOT NULL이 빠졌으니 NOT NULL 옵션만을 추가해보자. ALTER TABLE user MODIFY name varchar(50) NOT NUl..

[독서] 식사가 잘못 됐습니다. [내부링크]

서론 중3, 고1부터 나기 시작했던 여드름이 25살인 올해까지 멈추지 않고 끊임 없이 난다. 식습관이 잘못됐나 먹는 걸 좀 바꾸면서 이 기회에 건강한 식습관을 가져볼까 하면서 책을 읽기로 마음먹었다. 요즘 책을 읽으면서 드는 생각은, 책 모든 내용을 기억할 수 없다. 다른 사람들도 그런가.. 난 책을 읽다보면 앞 부분을 계속 까먹게 된다. 다 읽고 나서도 기억되는 부분이 많지는 않다. 그렇기에 난 새로 알게 된 것들과, 알고는 있었지만 앞으로 계속 기억하고 싶은 것들, 꾸준히 지켜보고 싶은 것들을 정리하려한다! c 본론 살이 찌는 원인은 대부분 탄수화물 문제다. 칼로리는 비만과 무관하고, 지방은 먹어도 살찌지 않는다. 설탕 또한 탄수화물이다. (쌀, 밀가루, 설탕) 이온 음료 또한 설탕물이기 때문에 ..

Kotest 5.1 이상 버전 java.lang.NoClassDefFoundError: kotlinx/coroutines/test/TestDispatcher 해결방법 [내부링크]

서론 사용 중인 버전 정보 kotlin - 1.6 kotest - 5.5.4 spring boot - 2.6.x 본론 kotest 도입을 위해 모듈을 추가해서 테스트를 돌렸더니 아래와 같은 에러가 발생했다. 원인 kotest 5.1 버전부터 kotlin-coroutiones 1.6 버전을 사용하고 있다. 하지만, spring boot 2.6.x 대의 kotlin-coroutiones 버전은 1.5.2 를 사용하고 있어서 문제가 발생했다. 해결방법 io.spring.dependency-management 에서 정의한 기본 버전정보를 변경해주면 된다. build.gradle.kts extra["kotlin-coroutines.version"] = "1.6.0" or gradle.properties k..

Spring JacksonObjectMapper는 어떻게 jackson-module-kotlin을 등록하나 [내부링크]

c 서론 이전에는 jackson-module-kotlin 모듈을 추가하면 자동으로 spring objectMapper에서 사용한다길래 그렇구나 하고 넘어갔었다. 찾아보게 된 계기는, 회사에서 만든 objectMapper가 jackson-module-kotlin 모듈을 추가했음에도 제대로 동작하지 않았었다. 처음에는 다른 문제 때문이라 생각했지만, 몇 번 다시 보니 objectMapper에 KotlinModule()을 넣어주는 부분이 없었다. 역시 모듈만 추가 한다고 자동으로 모든 objectMapper에서 적용되지 않을 텐데.. 생각이 매우 짧았다. 그래서 스프링에서는 어떻게 모듈 추가만으로 jackson-module-kotlin 를 사용하는지 궁금해서 찾아보게 되었다. c 본론 처음으로 1차원적으로 찾..

[F-Lab] 2022-02 ~ 2022-09 6개월.2주(?) 멘토링 후기 [내부링크]

결론 F-Lab을 통해서 좋은 멘토와 멘티를 만날 수 있었고, 의미 있는 시간을 통해 4월~9월 약 6개월의 공백 후 SI 회사에서 내가 원하는 서비스회사로 이직할 수 있게 되었다. 서론 지원 동기 뭐 많은 취준생, 신입 개발자들과 크게 다르지 않은 고민을 통해서 지원하게 되었다. 첫 번째 이유는, SI 회사에서 서비스회사로의 이직을 희망하였다. 프로젝트 기한을 맞추기에 급급하게 개발을 진행했고, 완료되면 다른 프로젝트를 개발하는 것이 내가 작성한 코드, 내가 만드는 프로그램에 애착이 생기기 힘들었다. 이 부분에서 본인만의 서비스가 있는 회사로 가고 싶었다. 또한, 유명한 IT 회사들이 자신의 회사들의 개발자들을 모집할 때 홍보하는 것 중 코드리뷰가 있는 문화, 개발자 존중 문화, 회사 복지, 재..

[일기] 실행계획을 사용해서 꼭 어떻게 동작하는 지 확인하자! [내부링크]

일기 글 이번 회사에서 컬럼을 새로 추가할 일이 생겼다. 20만 건 이상의 데이터가 존재하는 테이블이었고, 컬럼을 추가한 다음 추가된 컬럼을 여러 조건에 따라 업데이트를 해야 하는 요구사항이었다. 처음엔 쿼리를 바로 짠 다음 일단 돌렸는데.. 1시간 18분이 걸렸다.. pk로 검색했는데 속도가 이상하다고 느꼈고, 처음으로 실행계획을 통해 확인을 해왔는데 type이 ALL로 풀스캔을 하고 있었다. 조건을 변경하여 인덱스를 타도록 수정하였고, 결과는 1시간 18분이 걸리던 업데이트가 1초 이내로 끝이 났다. 지금까진 실행계획을 알고만 있고, jpa로 짜면서 사용할 기회(?), 생각이 별로 없었는데, 이번 기회를 통해 실행계획을 왜 사용하는지도 알았고, 인덱스가 왜 중요한지도 뼈저리게 느꼈다. 좋은 경험이..

[Error] Invalid character found in method name.HTTP method names must be tokens [내부링크]

서론 회사 프로젝트를 하다가 내부 통신 테스트를 로컬로 진행하다가 만난 상황 c 본론 보내는 쪽 에러 Unsupported or unrecognized SSL message 받는 쪽 에러 Invalid character found in method name[~~].HTTP method names must be tokens 원인 https 호출이 가능하지 않는 곳에 https를 호출한 경우 해결방법 호출 url을 https -> http 로 호출하면 된다. c 결론 파파고, 구글 없이 개발 모태

9월 핑계, 10월 다짐 [내부링크]

9월은 면접을 준비하고, 면접을 보러 다니느라 블로그 글을 코틀린 공부 시작한다는 히스토리 글밖에 작성하지 않았지만, 이전에 작성했던 글들을 많은 분이 찾아주셨고, 이전에 비해 댓글도 한 두 분씩 달아주셔서 감격이었다.. 면접을 준비하고, 면접을 보고, 면접 회고를 하고, 회사에 합격하고, 여행을 가고, 뒤늦은 코로나에 걸리고.. 이런저런 핑곗거리들로 인해 글을 작성하지 못했지만, 10월에는 좀 더 열심히 공부한 내용을 정리해봐야겠다. 물론 학습이 1순위! 시간이 된다면 첫 회사 퇴사 여정 및 6개월간 F-Lab 관련 회고도 작성하도록 노력해야지..!

[Kotlin] 코틀린 학습 시작! [내부링크]

서론 - 본론 - 결론 취업을 준비하고, 회사 채용공고를 보면서 가장 많이 느껴진 부분은 이제 Java가 아닌 Kotlin을 정말 많이 사용하고 있다는 걸 느꼈다. 그렇게 생각한 이유는 아무래도 대부분의 회사에서 자격요건에 Java만을 표기하기 보다는 Kotlin을 곁들인 경우가 많았다. 그리고 지금까지 내 주위에서 Kotlin을 써본 사람들 모두 입을 모아 이렇게 말한다. "자바로 돌아가기 싫다." 모두 코틀린의 장점으로 무조건 나오는 말은, Java에 비해 매우 간결하고, Java와 호환이 되며, 마지막으로 Null 처리에 대해서 아주아주 칭찬이 많았다. 왜 어떻게 Java를 대체하려고 웅성웅성인지 이제 너무 궁금해서 한 번 공부해봐야겠다!

[OS] 스레드 종류 알아보기 - 하드웨어, OS, 커널, 유저, 그린 ... [내부링크]

서론 java에서 사용하는 스레드라는 용어와 하드웨어에서 사용하는 스레드 그 외에도 커널 스레드.. 스레드라는 용어가 정말 다양한 곳에서 사용 중이란 걸 알게 되었고, 이에 대해서 제대로 알고 넘어가야겠다고 생각이 들어서 정리해봅니다! 이 글은 아래 영상을 보고, 정리하는 글입니다. 본론 각각의 구성요소는 아래를 의미합니다. Applications - 사용자의 프로그램들 Kernel - OS (Windows, Linux, MacOS...) CPU, Memory, Devices - 하드웨어 이 구조를 이해하고, 각각의 스레드들에 대해서 알아보도록 하겠습니다. Hardware Thread 인텔의 CPU를 보시면, 6개의 Core와 12개의 thread가 있습니다. 여기서 Core는 물리적인 연산장치이고..

[OS] 하드웨어의 CPU, Core, Thread [내부링크]

c 서론 최근 면접에서 프로세스와 스레드의 차이점에 대한 질문을 받았고, 컨텍스트 스위칭에 관한 추가적인 질문을 받게 되었습니다. 어느정도 알고 있다고 생각했지만, 막상 면접 질문으로 받으니 자세히 모르고 있었던 것 같아서 공부한 내용을 바탕으로 정리를 해봅니다. 본론 컴퓨터 구조 현재의 컴퓨터 구조를 만든 폰노이만의 아키텍처 입니다. 실제로 우리가 컴퓨터를 할 때 아래와 같이 다양한 프로그램들이 실행하게 됩니다. 이 프로그램들은 메모리(RAM)에 각각 올라가게 되고 (이를 프로세스라고 부릅니다.) 메모리에 적재된 프로세스를 CPU(혹은 프로세서)에서 실행을 하게 됩니다. 우리는 10개도 넘는 프로그램을 한 번에 실행도 할 수 있고, 20개도!! 넘는 프로그램들을 한 번에 실행할 수도 있습니다. 그렇..

[Spring] How to change the CamelCase to SnakeCase when i use POST form-url-encoded in Spring Cloud feign Client [내부링크]

서론 KakaoPay API 통신을 feign client를 통해 진행하는 중 POST로 form-urlencoded 타입으로 전송해야 하는데, @JsonNaming 애노테이션이 form-urlencoded 타입에서는 정상적으로 작동하지 않아 해결한 내용을 정리해봅니다.. ㅜ 이 글은, feign Client를 통해 요청을 보내는 방법을 정리합니다. 본인의 서버 컨트롤러로 받는 방법으로는 여기 에서 많은 해결책이 나와있습니다. 참고 바랍니다!! c 본론 FeignClient @FeignClient(name = "kakaoPay", url = "https://kapi.kakao.com/v1", path = "/payment", configuration = CoreFeignConfiguration.cla..

[DB] 락(Lock) - MySQL 8.0 InnoDB [내부링크]

c 서론 데이터베이스에는 트랜잭션이 존재합니다. 트랜잭션을 통해 하나의 작업 단위를 묶어서 ACID 원칙을 지키기 위해 노력합니다. 하지만, ACID 원칙이 언제나 완벽하게 지켜지진 않습니다. 너무 완벽하게 지키기 위해 어떤 상황에서라도 지키려고 한다면, 동시성이 떨어지는 문제가 발생하기 때문이죠! 그렇기 때문에 ACID 원칙을 적절하게, 상황에 맞게 유지시키면서 동시성을 높일 수 있게 DB에서 기능을 제공합니다. 바로 Isolation level을 통해서요! (트랜잭션에 대한 추가 설명은 이전 글을 참고해주세요!) 결국, Isolation level 별 적절한 Lock을 진행하고, 이는 DBMS마다 다릅니다. 저는 MySQL InnoDB 기준으로 어떤 Lock이 있는지 알아보도록 하겠습니다. c 본론 ..

[DB] 상황에 맞는 Unique ID 생성 방법 [내부링크]

서론 개발을 하면서, 유니크한 값을 사용할 일이 많습니다. 예를 들어 PK가 있을 수도 있고, 쿠폰번호가 있을 수도 있고, 결제번호가 될수도 있습니다. 유니크한 값을 만드는 방식들은 어떤 게 있고, 어떤 상황에 어떤 방식을 사용하는 게 좋을지 정리를 해보겠습니다. 본론 먼저 3가지의 유니크 ID를 생성 종류에 대해서 알아보고 각각 어떨 때 적용하면 좋을지에 대해 개인적인 생각을 적어보겠습니다! 1. RDBMS 의 Auto Increment 디비에서 자동으로 만들어주는 자동증가 값으로 PK 용도로 사용된다. 장점 구현이 매우 간단하다. 숫자 증가기 때문에 재정렬이 필요 없다. 순서가 보장된다. 물리삭제가 되지 않는 특성의 테이블의 경우 마지막 row id 값만으로도 대략 테이블 데이터의 수를 파악할..

[Spring] Spring Cloud Feign logging 설정 [내부링크]

서론 처음에 설정했을땐 logging not working.. logging이 작동하지 않아 간단하게 정리해봅니다. c 본론 public class CoreFeignConfiguration { @Bean Logger.Level feignLoggerLevel() { return Level.FULL; } } @FeignClient(configuration = CoreFeignConfiguration.class) public interface KakaoPayClient { ... } 코드를 추가해도 로깅이 찍히지 않아서 검색해본 결과 application.yml 에서도 logging을 설정해주어야 했었습니다. Fiegn Client가 포함된 패키지 혹은 클래스에 대해서 Spring Boot 로깅 수준을 D..

[Spring] Error creating bean with name 'configurationPropertiesBeans' defined in class path resource - Spring Cloud [내부링크]

c 서론 스프링 클라우드 gradle 설정 시 만난 오류.. 본론 [main] ERROR org.springframework.boot.SpringApplication - Application run failed org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'configurationPropertiesBeans' defined in class path resource [org/springframework/cloud/autoconfigure/ConfigurationPropertiesRebinderAutoConfiguration.class]: Post-processing of merged bean ..

[Ticketing] 유저 PK 대신 유니크 ID 만들어 사용하게 된 계기 (유니크 ID 생성) [내부링크]

c 서론 현재 진행 중인 Ticketing 프로젝트는 시스템이 분리되어있다는 가정 하에 진행된 프로젝트입니다. 여기서 결제시스템에서는 어떤 유저가 결제했는지에 대한 정보가 있어야 합니다. 처음 설계 당시에는 유저 PK 값을 넣어서 사용하려 했지만, 몇 가지 문제가 있어서 대체 유니크키 생성을 결정하게 되었고, 그 내용을 정리해보려 합니다. 본론 기존 ERD 구조입니다. 여기서 Payment 에서 User의 pk 값을 가지고 있죠. 고민의 시작인 API의 간단한 Sequence Diagram 입니다. 여기서 결제 목록 요청을 할 때 각 유저의 고유한 값을 Payment에서 가지고 있어야 유저의 결제 목록을 응답해줄 수 있습니다. 여기서 기존엔 User의 PK를 사용했는데, 왜 고민했는지 Email, U..

[Ticketing] 다른 테이블에 중복 데이터를 추가한 이유 [내부링크]

서론 현재 제가 진행 중인 토이 프로젝트는 '영화예매' 주제로 진행 중에 있습니다. 테이블 설계 이후 구현 단계에서 다른 테이블에 중복 컬럼을 왜 추가하게 됐는지 정리해보려 합니다. (많이 History 느낌의 글입니다.) c 본론 현재 프로젝트 상황 패키지 시스템 구조는 아래와 같습니다. 나중에 MSA 구조로 분리하기 위해 현재는 패키지만 분리해둔 상태입니다. ERD 영화 서비스에선 5개의 테이블 결제 서비스와 유저 서비스에선 각각 1개의 테이블이 있는 구조입니다. 요구사항 분석 회원 결제목록 조회 로그인된 사용자의 정보를 이용해서 결제 목록을 얻어온다. 결제목록은 영화제목, 금액, 결제상태가 존재한다. 요구사항을 위해서는? 결제목록을 가져오는 요구사항은, 현재 설계된 모든 서비스를 거치게 됩니다...

[Spring] 통합테스트 환경 분리 설정 - Gradle Kotlin DSL [내부링크]

c 서론 테스트를 돌릴 때 통합테스트는 Spring을 올리기 때문에 생각보다 긴 시간을 잡아먹습니다. 현재 프로젝트에서 통합테스트가 별로 없음에도 통합테스트와 유닛테스트 구분 없이 한 번에 돌리다보니 시간이 비효율적이라고 느꼈고, 환경을 분리해야겠다고 생각이 들어 내용을 정리해보겠습니다. 참고 참고로 gradle은 Groovy 가 아닌 Kotlin 으로 진행된 점 참고하여 봐주시길 바랍니다! 본론 build.gradle.kts 설정 sourceSets { create("intTest") { compileClasspath += sourceSets.main.get().output runtimeClasspath += sourceSets.main.get().output } } val intTestImplem..

[Spring] Exception 어떻게 처리할까? [내부링크]

c 서론 Exception Handler 를 구현하다 리펙토링 한 경험을 작성합니다. c 본론 기존 Exception 은 상황에 맞게 각각 Custom Exception 을 만들어서 처리를 했습니다. 문제점 Exception 마다 각각의 Handler 를 만들어주어야 했습니다. 클래스는 통합해서 작성해도 되지만, 여기서 중요한 건 만든 각각의 Custom Exception 별로 별도의 Handler를 추가로 계속 작성해주어야만 했습니다. 중복된 코드 private static final String MESSAGE = "패스워드가 일치하지 않습니다"; @ExceptionHandler(value = {PasswordMismatchException.class, BadCredentialsException.cla..

[인증/인가] 세션 / 토큰(JWT) 어떤걸 사용할까? [내부링크]

서론 간단한 사이트들을 제외하고, 대부분의 사이트에서는 회원 기능이 존재합니다. 회원 정보를 통해서 가입된 사이트에 글을 쓰거나, 읽거나 댓글을 달거나 문의를 넣거나 등등 다양한 기능들을 사용할 수 있게 되는데요! 하지만, 페이지를 옮겨다닐 때마다 회원 인증을 진행하고, 껐다가 켰을 때마다 다시 인증을 진행하고 이런 일은 .. 제가 아는 사이트에선 존재하지 않습니다. 이처럼 인증을 유지하기 위한 방법 중 세션 방식과 토큰 방식에 대해 장단점을 알아보고 어떤 걸 사용할지 정해보도록 하겠습니다. 본론 인증(Authorization) / 인가(Authentication) 기본 개념부터 잡고 가도록 하겠습니다. 인증(Authorization) 내가 누군지에 대해 사이트에 인증받는 걸 얘기합니다. 보통 I..

[Spring] enum으로 @Secured 권한 관리 [내부링크]

서론 @Secured("ROLES_GUEST") 기존 권한 관리방법은 매직리터럴로 처리가 되어 있었습니다. 이는 오타날 가능성도 있고, 나중에 관리하기도 힘들다는 판단을 하였고, 이를 enum 으로 처리한 과정을 정리해봅니다. c 본론 @Secured 애노테이션의 value는 String[] 를 받도록 정의되어 있기 때문에 enum 값을 받지 못합니다. 그러면 어떻게 해야할까? @RequiredArgsConstructor public enum UserGrade { ADMIN(ROLES.ADMIN, null), STAFF(ROLES.STAFF, ROLES.ADMIN), GUEST(ROLES.GUEST, ROLES.STAFF); private final String roleName; private fin..

[Spring] @PropertySource yaml 파일 Load 하는 방법 [내부링크]

c 서론 제가 느끼기엔 properties 보다는 yaml 파일이 더 가독성이 좋아 관리하기 쉽다고 생각합니다. 설정 파일을 불러와 객체를 만들 때 보통 @PropertySource 애노테이션을 사용하지만, default로 yaml을 읽지 못합니다. 그렇다고, yaml과 properties를 같이 사용하는 건 통일성이 없고, 그럴 필요가 없다 생각됩니다. 그렇기 때문에 이를 yaml 파일을 읽을 수 있도록 설정한 방법을 정리해봅니다. 본론 가져올 yml 파일의 설정 값입니다. @Getter @RequiredArgsConstructor @ConstructorBinding @ConfigurationProperties(value = "jwt") @PropertySource(value = "classpath..

[Redis] 레디스 선택하는 이유 [내부링크]

c 서론 이번 토이 프로젝트에서 Redis를 도입하기로 하여 Redis에 대해 학습한 내용을 정리해봅니다. Redis에 대해서 알아보기 전에 Cache에 대해 이해가 필요하신 분은, 아래 링크를 확인해주세요! [Network] 캐시(Cache) 알아보기 본론 Redis (Remote Dictionary Server) 란? in-memory 형태의 No-SQL로써 Key-Value 쌍의 해쉬 맵 형태의 데이터베이스입니다. in-memory: disk가 아닌 memory에 저장하기 때문에 disk I/O 작업이 발생하지 않아 속도가 빠르며, 휘발성입니다. No-SQL: Not Only SQL를 뜻하며 RDBMS에 비해 속도가 빠른 장점이 있습니다. in-memory 종류 No-SQL 종류 대표적인 비교 ..

[Network] 캐시(Cache) 알아보기 [내부링크]

c 서론 하나하나 차근차근 c 본론 캐시란? 자주 사용되는 결과 데이터를 미리 캐시 공간에 저장해서 다음 호출 때 빠르게 결과를 전달 캐시를 사용하는 이유 캐시를 사용하는 이유는 속도에 있습니다. 기본적으로 데이터가 저장되는 공간은 Disk입니다. 이유는 다른 Registers, Cache, Memory 들에 비해 저렴하고, 용량이 크기 때문입니다. 하지만, 그림에서 보시다시피 속도가 제일, 매우 느린 편에 속합니다. 엄청 잘 되는 서비스 같은 경우 디스크에서만 계속 불러오게 되면 속도가 따라주지 못해 결국 병목현상이 발생할 수 있습니다. 그럼 모든 데이터를 캐시에 넣어? 캐시는 휘발성을 띕니다. 이 말은, 컴퓨터를 껐다가 켜면 저장된 데이터가 전부 날아간다는 걸 의미합니다. 그리고, 가격 측면에서 ..

[Java] Gradle, Groovy Gradle, Kotlin Gradle [내부링크]

c 서론 이번 Project 에서 코드는 java를 사용하고, 빌드툴은 Kotlin Gradle DSL 을 사용하기로 하였습니다. Gradle에 대해서도 한 번 정리하면 좋을 것 같아서 글을 적어봅니다. 본론 Gradle 이란? https://github.com/gradle/gradle Gradle 은 빌드 자동화 및 다국어 개발 지원에 중점을 둔 빌드 도구입니다. 모든 플랫폼에서 소프트웨어를 Building, Testing, publishing, deploying 하는 경우 Gradle 은 코드 컴파일 및 패키징에서 웹 사이트 게시에 이르기까지 전체 개발 수명 주기를 지원할 수 있는 유연한 모델을 제공합니다. Gradle은 Java, Scala, Android, Kotlin, C/C++ 및 Gro..

[mermaid-js] 다이어그램을 markdown으로 쉽게. GitHub으로 간편하게. [내부링크]

c 서론 이번 프로젝트를 진행하면서 항상 그렇듯 ERD (Entity Relationship Diagram) 을 작성했습니다. 기존에 제가 사용해왔던 ERD 작성 툴은 2가지가 존재했습니다. ERD Cloud eXERD eXERD 는 유료버전이며, ERD 를 수정 및 보는 사람은 프로그램을 설치 해야한다는 단점이 존재하여 사이트 형식인 ERD Cloud 를 선택했습니다. 하지만 ERD Cloud 에도 단점이 존재했는데요, 바로 회원가입을 해야하고, 사용자 측면에서는 접근성이 떨어진다는 점입니다. 이번 프로젝트는 public 프로젝트이기 때문에 개발자 외에도 ERD 또한 공유하는 것이 목적이었고, 빠른 접근성을 원했습니다. 그렇게 해서 알게 된 다이어그램 mermaid js 에 대해서 공유하려 합니다. c..

[MySQL] Unknown column 'password' in 'field list' [내부링크]

c 서론 MySQL 8.0 버전으로 password field 를 보고 싶어서 검색을 했더니 'Unknown column 'password' in 'field list' 이와 같은 에러를 만나서 간단하게 정리해봅니다. c 본론 위처럼 password 필드에 접근하려고 하면 에러가 발생합니다. 원인을 찾아본 결과 MySQL 5.7 버전에서 password 필드가 사라지고, authentication_string 필드가 새로 추가된 걸 확인할 수 있었습니다. 개인적으로 추측하자면, 5.7 버전에 password 에 관한 설정 정책들이 새로 추가된 게 영향이 있지 않을까 생각됩니다. 5.7 이상부터는 8자 이상, 소문자+대문자+숫자+특수문자 조합 등 등급 별 패스워드 체크가 새로 추가되었습니다. 이로 인해 5..

[MySQL] Mac M1 에서 MySQL password 재설정 [내부링크]

c 서론 아래 스펙 기준으로 작성하였습니다. (* 1. 경로이동 외에는 스펙과 무관 할 수 있습니다.) - MacBook Air M1 - homebrew 로 설치 본론 1. 경로 이동 /opt/homebrew/opt/mysql/bin 2. mysql 종료 mysql.server stop 3. 인증생략 옵션 mysqld_safe --skip-grant-tables & 4. mysql 비밀번호 없이 접속 mysql -u root 5. password null 로 셋팅 UPDATE mysql.user SET authentication_string=null WHERE User='root'; 6. 권한 적용 FLUSH PRIVILEGES; 7. mysql 밖으로 이동 exit; 8. mysql 재접속 mysq..

[SPRING] 스프링 MVC 구조? (DispatcherServlet?) [내부링크]

c 서론 스프링은 정말 사용자가 사용하기 편한 기능들을 많이 제공해준다. 그 중에서도 컨트롤러는 정말 다양한 파라미터와 리턴 값을 사용자 뜻대로 이것저것 가져와서 사용할 수 있다. 예를 들어 파라미터로 String이나 Integer 로 받을 수도 있고, 직접 만든 DTO 객체로도 받을 수 있다. 또, 리턴 값으로 String으로 view 경로를 보낼 수도 있고, 진짜 String을 보낼 수도 있고, ModelAndView 를 보낼 수도 있다. 어떻게 Spring은 이렇게 다양하게 사용자 입맛대로 만들 수 있게 해주는지에 대해서 파악해보자. 스프링 MVC에서 받을 수 있는 인수 - 링크 본론 Dispatcher Servlet 일단, 가장 중요한 Dispatcher Servlet에 대해서 개념을 잡고 가..

[SPRING] @Valid @Validated 사용하기 - java bean validation [내부링크]

서론 이전에는 @Valid 가 어떻게 흘러가는지 알아봤다면 이번에는 사용하는 방법에 대해서 간략하게 적어보려 한다. 이전 글 - [SPRING] @Valid 어떻게 동작할까 - java bean validation 목차 - @Valid 사용법 - Custom Aonntation - @Valid 예외처리 - @Valid 에선 안되는 것들 - @Validated 동작 원리 - @Validated 사용법 - @Validated 예외처리 c본론 어노테이션 종류가 어떤 것들이 있는지는 API 공식 문서를 참고해보면 좋을 것 같습니다. API 공식문서 - 링크 @Valid 사용법 의존성 추가 // Gradle implementation 'org.springframework.boot:spring-boot-start..

[SPRING] @Valid 어떻게 동작할까 - java bean validation [내부링크]

서론 애플리케이션 개발을 진행할 때 검증은 가장 중요한 작업이다. 클라이언트에서 데이터가 제대로 넘어왔는지, 비지니스 로직에서 인수가 제대로 된 값이 넘어왔는지, db에 값이 저장 혹은 수정되기 전에 제대로 된 값이 맞는지 등 정말 다양한 곳에서 데이터 검증이 필요하며 놓쳐서는 안되는 중요한 작업이다. 이 검증을 쉽게 할 수 있는 @Valid 에 대해서 알아보았다. 목차 - @Valid 는 뭐지? - @Valid 왜 사용하는거지? - @Valid 어떻게 사용하는거지? - Jakarta Validation API 살펴보기 - Jakarta Validation API 구현체 찾기 - Hibernate Validator - Spring 에서 @Valid 동작 원리 c본론 @Valid 는 뭐지? JSR 303..

[Java] GC Implementations - 가비지 컬렉션 구현 [내부링크]

서론 이전 글을 통해 JVM 내에서 GC가 어떻게 동작하는지를 학습하였다. 하지만, GC도 여러 종류로 구현을 한 것을 알게 되었고, 그 부분에 대해서 다뤄보려 한다. 이전글 - [Java] GC (Garbage Collection) ?? [Java] GC (Garbage Collection) ?? 서론 Java가 유명해진 큰 이유 중 하나로는 역시 다른 언어와는 다르게 GC라는 녀석이 있기 때문이다. 그렇기에 Java를 제대로 이해하고 사용하려면 GC가 무엇이고, 어떤 걸 하는지, 어떻게 무엇 kdhyo98.tistory.com 본론 JVM에서 GC 구현은 5가지의 유형이 존재합니다. - Serial Garbage Collector - Parallel Garbage Collector - CMS..

[Java] GC (Garbage Collection) ?? [내부링크]

서론 Java가 유명해진 큰 이유 중 하나로는 역시 다른 언어와는 다르게 GC라는 녀석이 있기 때문이다. 그렇기에 Java를 제대로 이해하고 사용하려면 GC가 무엇이고, 어떤 걸 하는지, 어떻게 무엇을 튜닝해야 할지를 알아야 Java 개발자로서 성장하는 데에 필수 조건이라 생각하기에 한번 정리를 해본다! 본론 GC(Garbage Collection) ? 직역하자면, 쓰레기 수거를 의미합니다. 결국 불필요한 즉, 사용되지 않는 메모리에 할당된 객체들을 직접 정리해주는 역할을 하고 있습니다. 한 줄로 정의하자면, Heap 영역에서 더이상 사용되지 않는 객체들을 메모리에서 제거합니다. GC가 왜 필요하지? GC가 없는 다양한 언어들에서는 메모리를 직접 정리해주어야 합니다. 그렇기 때문에 객체를 하나하나 연..

2022.02 회고 [내부링크]

서론 작년까지는 일 년 계획을 주로 세웠었다. 하지만 제대로 지켜진 건 별로 없었고, 기억에 남는 것도 별로 없었고, 뒤돌아봤을 때 "나 뭐 했지?" 라는 생각이 들곤 했다. 이렇게 또 일 년이라는 시간을 버릴 수 없었기에 이제는 큰 목표로 일 년을 잡고, 상세한 한 달을 잡고, 더 상세한 일주일을 잡고, 더더욱 상세한 하루 계획을 잡아서 한 달 단위로 회고를 통해 뒤돌아보면서 앞으로의 계획을 더욱 잘 정리할 수 있게 해보려 한다. c2월 한 달간 보냈던 일 회사 업무 업무 내용 비공개(내가 까먹을까봐, 노션정리 22년3월1일) 만족도 : 60% 현재 진행 중인 프로젝트가 없기에 3월부터 진행할 프로젝트 분석을 주로 하면서 새로 개편할 것들에 대한 학습 위주로 진행했었다. 그중 인턴 친구들의 코드리뷰를..

[MySQL] 매일 밤 12시 콘솔 창 안 뜨게 하는 방법 [내부링크]

서론 하루에 한 번 정도 MySQL 관련된 콘솔 창이 계속 발생해서 끄는 방법을 찾았고, 공유해 봅니다. 본론 아래 이미지를 보시면서 따라하시면 됩니다. 순서 제어판 - 시스템 및 보안 - 관리도구 - 작업 스케줄러 - MySQL - Installer - MainifestUpdate - 사용안함 클릭

[Intellij] JPA cannot resolve column name 해결방법 [내부링크]

c서론 git commit을 진행하는 도중 entity 클래스에서 Warning이 발생했다. 본론 Intellij 에서 db연결이 되어 있지 않아서 인식하지 못하는 문제인 것 같습니다. 아마 Intellij가 하나하나 꼼꼼하게 체크를 해서 발생하는 것 같네요.. (이클립스땐 이런거 없었는데) 해결방법은 2가지가 있습니다. 1. 해당 warning을 끈다. 2. Database를 연결한다. 하나씩 살펴보겠습니다. 1. 해당 warning을 끈다. Settings - Editor - Inspections - Unresolved database references in annotations 체크해제 - OK 2. Database를 연결한다. View - Tool Windows - Database + - Da..

[QueryDSL] return 으로 Map(집합) 받기 [내부링크]

서론 테이블 목록을 가져와 목록에서 ID를 통해 내부 정보를 여러 번 조회할 일이 있었다. 쿼리에서 List 로 조회해서 for문으로 돌리기에는 중복된 ID를 여러 번 조회할 수도 있고, 결국 ID를 통해 다른 값들을 얻고 싶은 게 목표 이기에 QueryDSL에서 return으로 Map도 받을 수 있는지 찾게 되었고, 찾아서 정리를 해본다. c준비 위 데이터를 기준으로 결과 값 확인을 진행합니다. c본론 Querydsl에서는 결과 집합(aggregation) 이라는 걸 제공해주는 걸 알았습니다. 결과 처리 방법 쿼리에서 데이터 조회 후 메모리에서 결과에 대한 집합 연산을 수행하는 집합 함수를 의미 합니다. 간단한 예시로 살펴보겠습니다. 1️Map Value 하나 받기 select는 transform에..

노마드 개발자 북클럽 클린코드 참여 [내부링크]

미루고 미룬 클린코드를 완독하기 위해 니꼬쌤과 함께하는 북클럽 참여해봅니다! (참여 진행 중) https://nomadcoders.oopy.io/ 노마드 개발자 북클럽 니꼬쌤이랑 같이 책 읽기! 개발자 필독서, 이번에 200% 완독 해보는건 어때요? 한 달 1권 읽기. 지금 시작해보세요! nomadcoders.oopy.io #노개북 #노마드코더 #북클럽

[Java] 22년 부터는 Integer 타입을 사용할 때 조심하자! [내부링크]

서론 21년까지 잘 작동하던 Integer.valueOf() 에서 NumberFormatException이 발생했다. c본론 (코드는 보기 쉽게 하기 위해 실제 코드와 다르게 작성하였습니다.) public static void main(String[] args) { String value = "2201060002"; String defaultValue = "221060001"; Optional.ofNullable(value) .map(Integer::valueOf) .map(num -> num += 1) .map(String::valueOf) .orElse(defaultValue); } 간단한 패턴 값을 만드는 로직이었다. 패턴 - YYMMDDXXXX 해당일자의 고유한 값을 저장하기 위해서, value..

[Java] static inner class 는 언제 로드가 될까? 로드와 초기화? [내부링크]

서론 최근 싱글톤을 직접 구현하여 사용하게 되었고, 스레드 세이프를 하기 위해서 static inner class를 사용하게 되었다. public class LottoTicketBooth { private LottoTicketBooth() { } private static class LottoTicketBoothHolder { private static final LottoTicketBooth LOTTO_TICKET_BOOTH = new LottoTicketBooth(); } public static LottoTicketBooth getInstance() { return LottoTicketBoothHolder.LOTTO_TICKET_BOOTH; } } 위와 같이 사용하게 된다면 LottoTicketB..

[Java] junit5 파라미터로 List 전달하는 방법 [내부링크]

서론 junit으로 파라미터 전달하는 어노테이션은 여러가지가 존재한다. @ValueSource @CsvSource @NullSource @NullAndEmptySource 이 외에 더 있다.. 그 중에서 List로 Parameter를 전달하는 방법이 필요해서 검색한 도중에 찾게 되었고, 자주 사용할 것 같아서 기록해두려 한다. 본론 @ParameterizedTest - 파라미터를 전달받을 수 있는 테스트를 만든다. @MethodSource("메소드 명") - 메소드의 리턴 값으로 파라미터를 전달한다. static Stream generateData() { return Stream.of( Arguments.of(Arrays.asList(1, 2, 3, 4, 5, 46), "MethodSource 테스트..

[NextStep] TDD, Clean Code with Java 13기 1~2주차(자동차 경주) 회고 [내부링크]

서론 2021.11.01 부터 진행하여 11.14까지 자동차 경주를 진행하였다. 아직 step5 PR을 진행 중에 있지만.. 어제가 2주차 마지막 이었으니 까먹기 전에 미리 자동차 경주를 진행하면서 느낀 것들에 대해서 정리를 하는 게 좋다고 생각이 들어 적어본다. 목차 GIT을 활용한 PR 경험과 GIT commit 메세지 컨벤션 객체지향 생활체조 원칙, 객체지향설계(SOLID) TDD와 클린코드 코드리뷰 경험 TDD란 무엇인가? 클린코드란 무엇인가 본론 1. GIT을 활용한 PR 경험과 GIT commit 메세지 컨벤션 지금까지는 git을 제대로 써볼 기회? 노력? 과 같은 것들을 하지 않았었다. - 현재 회사에서 svn을 사용하고 있고 - 혼자서 어떻게 써야할지 감도 안 오고 - 회사 다닌 이후로..

[SPRING] 스프링의 컨트롤러는 어떻게 여러 작업을 처리할까? [내부링크]

c서론 'TDD, Clean Code with Java' 자동차 경주 미션을 진행하던 도중 해당 리뷰를 받았고, 궁금한 게 생기게 되었다. 스프링의 컨트롤러는 Bean을 통해 싱글톤으로 하나의 객체만이 생성이 될텐데.. 어떻게 여러 작업을 처리하지..?c 본론 제가 이상하다고 생각했던 부분은 이 부분입니다. 1개만이 생성된 컨트롤러가 어떻게 동시에 10건이든 10만건이든 아무 문제 없이 잘 처리할 수 있지?? 고민의 답을 찾기 위해 구글을 돌아다니던 중 저와 같은 고민을 한 글을 발견하고 답을 찾았습니다. (블로그) Controller 1개가 어떻게 수 많은 Request를 처리하는가? (spring mvc, tomcat thread, singleton bean) Controller 1개가 어떻게 수 ..

[MS-SQL] IN 구문 사용 시 매개변수 2100개 초과 [내부링크]

서론 잘 되던 게 안 됐다. 어떤거 때문일까??c 본론 MS-SQL에서는 매개변수를 최대 2100개까지만 허용하도록 해놓았다. 원인은 IN문을 통해 2100개 이상의 매개변수가 전달이 되어서 안 됐던 것.. 이전에는 2100개까지 전달할 일이 없었지만 최근 데이터가 커지면서 발견된 버그! SQL에 대해 또 하나를 알아간다.. * 해당 문제는 IN으로 조회한 컬럼 외에 다른 컬럼으로도 조회할 수 있는 방법으로 해결이 되었다. * IN 문 자체가 효율이 좋지 않기 때문에 IN을 쓸 때에는 다른 방법으로 할 수 있는지를 체크해 보는 것도 좋은 방법일 것 같다. 다른 SQL들은 ?? MySQL은 max_allowed_packet 값을 통해 최대 크기가 결정되는 데 기본 값은 64MB 이다. Oracle은 최..

TDD, Clean Code with Java 13기 신청 이유 [내부링크]

서론 c내 포트폴리오는 부족해.. 뭐가..? 포트폴리오를 만들었지만.. 부족하단 걸 많이 느꼈다. 하지만 어디서부터 수정해야 할지.. 어디가 크게 부족한지.. 어느게 필요할지.. 감을 못 잡고 있던 와중 어딘가에는 물어보고 수정을 해야겠단 생각이 들어서 인프런에서 진행 중인 멘토링 시스템을 통해 배민에서 일을 하고 계신 이동규 멘토님께 이력서 검토신청을 하였다. 멘토링 후기 처음 받아보는 포트폴리오 점검(?) 이었다. 확실히 갈피를 잡지 못했던 나의 상황을 정확하게 캐치하셨고, 많이 부족한 걸 깨닫게 해주셨다. 경쟁력이 없는 실력이란 걸 확실히 일깨워주셨다랄까..? 부족한 점이 하도 많아서 일일이 나열할 수도 없는 수준... 본론 NextStep을 알게 되다. 멘토링을 해주신 이동규 멘토님은 NE..

2021 Dev-Matching: 웹 백엔드 개발자(하반기) 참여 후기 [내부링크]

이전 내 모습 학교를 다니는 내내 알고리즘 공부를 하는 일이 없었다.. 현재 회사 또한 학교 연계로 입사를 하게 되어 코딩테스트를 보지도 않았고, 딱 작 년이었던 취업 준비할 시기에 '일단은 빠르게 취업하여 경력을 쌓자!'라는 생각을 가지고 있었기에 코딩테스트를 준비해서 취업하는 것 보다 학교 추천을 통해 회사를 빠르게 입사하는 걸 목표로 하고 있었었다.. 하지만 미래를 위해서라도, 혹시 모를 기회가 생겼을 때 잡으려면 코테를 미리미리 준비해야겠다라는 생각이 들게 되었고 천천히 준비하자라는 생각이 들었다. 그렇지만.. 위 생각은 입사 한 6개월 차부터 가지고 있었으나.. (파이썬으로 코테도 해보고 했었음..) 현재 회사에서 사용하고 있는 java, spring boot, jpa, querydsl 모두..

[JPA] save() 성능개선 하기 [내부링크]

서론 사내 모든 프로젝트에서는 데이터베이스에 값을 저장할 때 아이디를 유니크한 값으로 자동생성해주는 로직을 만들어 별도로 태운 후 save()를 하게 된다. 결국 이로 인해 처음 INSERT를 하기 위해서 save를 보낸 모든 데이터 또한 SELECT를 꼭 호출하고, INSERT를 호출하게 되는 문제가 있다. 이는 데이터가 많으면 많을 수록 성능저하에 큰 문제가 있기에 이 로직을 파악하고 성능개선하는 방법을 공유해본다. 본론 save() 로직 파악하기. SimpleJpaRepository 클래스에 있는 save()메소드는 아래와 같이 동작을 한다. @Transactional @Override public S save(S entity) { Assert.notNull(entity, "Entity ..

[Java]Stack 대신 Deque 사용하기 [내부링크]

서론 스택이 필요해서 사용하려고 하던 중 소나린트에서 Stack 대신 Deque를 사용하는게 좋다는 안내가 나왔고, 왜 그런지 알아보려 한다. 본론 스택(Stack)이란? - 자료구조의 하나로서 후입선출(Last In First Out)를 의미한다. - 후입선출이란 마지막에 들어온 데이터가 가장 먼저 나가는 방식을 의미한다. - 자바에서는 Stack을 class 형태로 지원해주고 있다. 반대개념 큐(Queue) - Queue의 경우는 선입선출(First In First Out)를 의미한다. - 선입선출이란 처음에 들어온 데이터를 가장 먼저 내보내는 방식을 의미한다. - 자바에서 Queue는 인터페이스로 구현이 되어 있어 보통 LinkedList를 사용해서 구현하곤 한다. 그럼 Deque란? - 자바 ..

[Java] HashMap. stream으로 sum하기 [내부링크]

서론 이번 HashMap에서 sum을 해야하는 상황이 생겨서 분명 get으로 꺼내서 하나씩 sum하는 것 말고 stream으로 하는 방법이 있을 것 같아서 찾아봐서 기록한다. 본론 mapToInt와 reduce 방식 두 가지를 보게 되었는데 reduce가 개인적으로 더 깔끔해보여서 자주 사용하게 될 것 같다. public static int getSum(final Map data) { return data.values().stream().mapToInt(Integer::intValue).sum(); } public static int getSum(final Map data) { return data.values().stream().reduce(0, Integer::sum); } 역시.. 항상 '이런거..

[SPRING] @Transactional readOnly 성능향상 이유 [내부링크]

c서론 트랜잭션에 있는 readOnly가 읽기전용모드로서 cud가 발생하게 되면 에러를 뱉어주고, 읽기만 가능한 기능으로 알고 있었다. 그런데, 왜 성능향상에도 도움이 되는가에 대해선 자세히 몰라서 알아보았다. 본론 @Transactional(readOnly = true) 트랜잭션에서 readOnly=true 라는 옵션을 설정한다. FlushMode 를 MANUAL로 변경하여 dirty checking(변경감지) 을 생략한다. flush와 commit이 일어나지 않고, 이로 인해 영속성 컨텍스트에서는 스냅샷을 보관하지 않아 약간의 성능향상이 이루어지는 것. 크게 눈에 띄게 성능향상이 이루어지지는 않는다고 한다. 보통 사용하는 이유로는 해당 메소드가 변경이 되면 안되고, 조회하는 걸 명확하게 명시해주기 ..

[SPRING] synchronized와 @Transactional 을 동시에 사용 시 문제점 [내부링크]

서론 @Transactional 어노테이션과 synchronized을 동시에 사용하고 싶은 경우가 있을 수 있다. 트랜잭션 격리수준과 별개로 해당 메소드를 동기화를 적용시키고 싶을 때. 하지만, 한 메소드 위에 해당 Transactional, Synchronized를 동시에 적용 시 원하는대로 작동하지 않을 수 있다. 그 이유를 알아보자. 본론 아래 예시는 스택오버플로우를 번역하여 풀어서 정리했습니다. c뭐가 문제지? 일단 Synchronized를 사용하는 이유는 해당 메소드를 한 쓰레드에서만 돌리기 위해서다. 하지만, 트랜잭션이 같이 정의가 되어있다면 첫 번째 쓰레드가 끝나기 전 두 번째 쓰레드가 발동할 수도 있다. 그 이유를 살펴보자. @Transactional public synchronized..

[JavaScript] 교집합, 합집합, 차집합 구현 [내부링크]

서론 파이썬 코드로 알고리즘을 공부하다가 파이썬에선 집합들을 엄청 쉽게 구현하는 것들을 보고 충격받았다... js에서도 있나 찾아봤는데 없는 것 같아서 따로 코드로 정리를 해보려고 한다. 본론 파이썬 코드 first = set([1, 2, 3, 4, 4, 2]) second = set([1, 3, 5, 1]) print(first | second) # 합집합 [1, 2, 3, 4, 5] print(first & second) # 교집합 [1, 3] print(first - second) # 차집합 [2, 4] 위 코드를 js 문법을 통해서 구현해보려 한다. JS 코드 const first = new Set([1, 2, 3, 4, 4, 2]); const second = new Set([1, 3, 5,..

[JavaScript] Object key and value loop Object.entries() [내부링크]

c서론 파이썬 문법에 key와 value를 한 번에 가져와서 for문을 돌리는 걸 보고 js에도 있나 찾아보게 되었다. c본론 파이썬 문법 stations = {} stations['kone'] = ['id', 'nv', 'ut'] stations['ktwo'] = ['wa', 'id', 'mt'] for key, value in stations.items(): print(key) print(value) 딕셔너리를 key, value 모두 가져와서 사용할 수 있다. 자바스크립트 문법 const object1 = { a: 'somestring', b: 42 }; for (const [key, value] of Object.entries(object1)) { console.log(`${key}: ${valu..

[SPRING] AOP 우선순위 설정하기. [내부링크]

c서론 AOP에 대해서 공부하다가 만약 AOP가 두 개 이상이 적용되면 순서는 어떡하지란 생각이 들었다. 본론 순서적용 되기 전 위와 같은 AOP를 두개를 만들었다. 호출결과 어째서 이 순서대로 나왔는지는 잘 이해하지 못하겠다.. 아마 직접만든 AOP들의 순서를 Spring에서 지정해주는대로 아무렇게나 되길 원하는 개발잔 없을거다. 그러므로, 직접 순서를 정해주자! 순서적용 후 호출결과 Order 숫자가 작을수록 먼저 실행되고, 큰 수가 뒤에 실행된다. => 오더숫자가 클 수록 먼저 감싸진다. 이렇게 @Order(value = ?) 설정을 통해 내가 원하는대로 AOP 감싸는 순서를 정할 수 있다.

[VSCODE]Do you trust the authors of the files in this folder? [내부링크]

VS Code 1.57부터 작업하려는 폴더가 신뢰할 수 있는 작업공간인지 확인하는 시스템이 도입되었다. 말 그대로 해당 폴더가 안전한 폴더인지 확인하는 시스템이다. Yes, I trust the authors 선택 시 해당 폴더를 신뢰하는 폴더로 인식하고 모든 편집기 기능을 사용할 수 있습니다. No, I don't trust the authors 선택 시 작업공간을 '제한모드'로 설정하여 Tasks, Debugging을 비롯한 몇몇 편집 기능을 사용할 수 없게 됩니다. 비활성화에서 활성화로 변경 vscode 좌측 맨 하단에 'Restricted Mode' 클릭 좌측에 'Trust' 버튼을 클릭하면 활성화가 됩니다. 활성화에서 비활성화로 변경 vscode 좌측 맨 하단에 설정버튼 클릭 후 'Manage ..

[SPRING] @Transactional (트랜잭션) 강제 롤백 [내부링크]

본론 로직을 구현하다가 아래와 같은 상황을 마주한 적이 있었다. 트랜잭션 내에서 쿼리작업을 진행하다가 validation을 통해 걸렸을 때 에러는 발생하지 않고, 지금까지 변경된 쿼리를 롤백을 시켜야 할 떄 @Transactional 은 Exception 이 발동할 때만 롤백을 시킨다. c그러면 어떻게 롤백을 시켜야할까? TransactionAspectSupport.currentTransactionStatus().setRollbackOnly(); 트랜잭션이 롤백하는 방법을 강제적으로 넣어주는 것이다. setRollbackOnly 을 통해 트랜잭션이 종료되었을 때 무조건 롤백을 시키도록 설정하는 것이다. 물론 해당 로직은 리팩토링 작업을 통해 validation과 쿼리작업을 분리하였다. 당장 테스트를 해..

[SPRING] Spring AOP Proxy - @Transactonal 사용 시 주의사항 [내부링크]

서론 상속받은 클래스 내에 @Transactonal 이 걸려있는 삭제 메소드가 트랜잭션이 발동을 안 하는 버그를 발견했다. 같은 클래스 내에서 프록시가 발동하지 않는다는 것은 알고 있었지만, 막상 겪으니 다른 클래스인데 뭐가 문제지..? 란 생각에 빠져서 찾는 대에 시간을 좀 사용했다.. 그 김에 작성.. 본론 스프링은 AOP를 하기위해 기본적으로 디자인패턴인 프록시패턴을 채택하여 사용하고 있다. AOP(Aspect Oriented Programming) 관점지향 프로그래밍이라는 뜻으로 여러 곳에서 사용되는 공통된 로직을 모듈화하여 비즈니스 로직에서 분리시켜준다. 이로써 우리는 비즈니스 로직 외에 부가적인 로직은 따로 외부에서 관리하여 유지보수 및 재사용성이 용이해진다. 프록시(Proxy) 스프링의 ..

[JAVA+MSSQL]드라이버가 SSL(Secure Sockets Layer) 암호화를 사용하여 SQL Sever로 보안 연결을 설정할 수 없습니다. - 오류 해결방법 [내부링크]

서론 DB : MSSQL JDK : zulu 11 version OpenJDK 11버전으로 올린 후 기존 MsSql을 진행하던 프로젝트에서 아래와 같은 에러가 발생했다. Caused by: com.microsoft.sqlserver.jdbc.SQLServerException: 드라이버가 SSL(Secure Sockets Layer) 암호화를 사용하여 SQL Sever로 보안 연결을 설정할 수 없습니다. 오류: "The server selected protocol version TLS10 is not accepted by client preferences [TLS13, TLS12]". 본론 c원인 TLS(Transport Layer Security) 전송계층보안 이라는 암호화 보안 프로토콜은 데이터 전..

Spring Tool Suite(STS) 다운로드 및 설치 [내부링크]

서론 이클립스와 STS 중 고민을 했었는데, 뭐 spring 말고 다른 프로젝트를 할 것도 아니고 이미 플러그인이 깔려있는 STS를 선택해서 꾸준히 사용 중에 있다. 나중에 기회가 된다면 인텔리제이를 사용하고 싶다.. 본론 1. 다운로드 - 공식사이트 접속 - 해당 OS 에 맞는 버튼 클릭 - 다운로드 받은 파일 압축 풀기 - 해당 폴더로 이동 - SpringToolSutie4.exe 실행 - Workspace 경로 설정 - 끝

Open JDK 설치 (zulu jdk 11) [내부링크]

서론 2019년 1월부터 oracle jdk가 무료버전이 종료됨에 따라서 무료인 open jdk로 넘어가기 시작했다. 많은 open jdk 중 azul에서 제공하는 zulu jdk 를 설치하는 방법을 간단하게 설명하겠다. 본론 1. 다운로드 방법 원하는 Version , OS , Java Package 를 검색하면 쉽게 원하는 버전을 찾을 수 있다. .msi 를 자신의 환경에 맞는 파일을 선택해서 다운로드 하면 된다. 2. 설치방법 Next -> Next -> Install -> Finish 버튼 클릭 3. 설치 확인 - cmd 창 열기 - java --version 입력 설치가 정상적으로 완료되었습니다..!

[Java] 객체[Object] List 중복된 ID 목록만 뽑기(추출) [내부링크]

서론 알고리즘 문제 때문인가 객체, 리스트, 배열 중복에 관련해서는 대부분 중복 값을 제거하는 설명이 대부분이었다. 가끔가다 중복 값 개수 세기 정도는 있지만 중복 목록만을 뽑는 글은 안 보여서 ... (구글링이 부족할지도) 시작! 본론 0. 시나리오 UserList를 받아 저장시킬 때 해당 List 내에 중복된 ID 목록을 return 시켜줘야 한다. 내가 필요한건 객체 내에 중복된 ID를 찾는 것. 00. 객체정보 aaa - 3번 / bbb - 3번 / ccc - 2번 / ddd - 1번 / eee - 1번 1. 스트림(Stream)과 Set을 사용하기 - 스트림을 통해 userId 목록만을 가져온다. - 새로만든 List 목록을 for문을 돌린다. - 아이디마다 indexOf와 lastIndex..

[Java] Random보단 SecureRandom 를 사용하자. [내부링크]

c서론 Random을 사용하다가 소나큐브에서 Critical 버그가 발생했다. 그 후 알아본 내용을 정리해본다. 본론 - 에러 메세지 (번역은 구글번역을 통해 되었기 때문에 오역이 있을 수 있습니다..) "Random" objects should be reused "랜덤" 객체는 재사용되어야 한다. Random 값이 필요할 때마다 새 개체를 만드는 것은 비효율적이며 JDK에 따라 임의의 숫자가 생성되지 않을 수 있습니다. 효율성과 임의성을 높이려면 단일 Random을 만든 다음 저장하고 다시 사용하세요. Random()생성자는 별개의 값마다에 씨앗을 설정하려고 시도합니다. 그러나 시드가 무작위로 또는 균일하게 분포 될 것이라는 보장은 없습니다. 일부 JDK는 현재 시간을 시드로 사용하므로 생성 된 숫자..

[Java]Collections.emptyList() vs. new instance 어떤 차이가 있을까? [내부링크]

c서론 스택오버플로우를 보다가 아하! 싶은 내용이 있길래 정리를 해본다. 리턴을 null로하는 것은 매우매우 위험한 행동이다. 그렇기에 우리는 새 인스턴스를 만들어서 리턴을 시켜줄수도 있고, 라이브러리를 통해 emptyList()를 리턴해줄수도 있다. 둘은 어떤 차이가 있을까? 본론 아래 두 방식의 차이를 알아보자. return Collections.emptyList(); return new ArrayList(); 일단 Collections.emptyList()가 뭔지 알면 쉽게 정리할 수 있다. public static final List emptyList() { return (List) EMPTY_LIST; } 이 메서드를 구현하면 각 호출에 대해 별도의 목록 개체를 만들 필요가 없습니다. 이 방법..

[Java]for문 List를 Null 체크하는 방법 [내부링크]

c서론 for문을 돌리는 List를 어디선가 받아와서 사용할 때 null인 경우가 있을수도 있기 때문에 예외처리는 필수적으로 해주어야 한다. (물론 NULL이 처음부터 발생하지 않게 해주는 것도 중요하다.) 내가 하던 방식이 비효율적으로 느껴졌고, 다른사람들은 어떻게 null 체크 하는지에 궁금증이 생겨서 알아보게 된 걸 기록해본다. 본론 AS-IS 기존 내가 null 체크 했던 방식들 if(productionList != null) { for (String production : productionList) { // 로직구현 } } else { // 예외처리 } if(productionList == null) { return ; // or 예외처리 } for (String production : pr..

[Java] List Null 체크 하는 방법들 [내부링크]

c서론 리스트 null을 체크하는 방식이 여러 방법이 있어서 정리할 겸 작성한다. 소개할 List null 체크 방식은 아래와 같다. - xxxxList == null - xxxxList.size() == 0 - xxxxList.isEmpty() - CollectionUtils.isEmpty(xxxxList) 테스트 방식은 2가지로 나눠서 할 예정이다. 1. List가 null일 경우 2. List가 생성된 경우 테스트 코드 @Test @DisplayName("nullList체크") void nullListTest() { List nullList = null; assertTrue(); // 코드작성 } @Test @DisplayName("newList체크") void newListTest() { Lis..

[Linux] CentOS, Ubuntu OS 버전 확인 [내부링크]

리눅스(Linux)의 커널(kenel)이란? - 하드웨어 제어 및 파일 자원등을 관리하는 OS의 핵심 부분. 버전확인을 위해 사용되는 cat 명령어? - 파일 내용을 출력. - 여러 파일을 전달 시 연속해서 출력. 예시 - cat { file1 } - cat { file1 file2 file3 } 커널 버전 확인 1. 간단하게 [root@localhost /]# uname -r 3.10.0-514.16.1.el7.x86_64 2. 상세정보 [root@localhost /]# uname -a Linux localhost 3.10.0-514.16.1.el7.x86_64 #1 SMP Wed Apr 12 15:04:24 UTC 2017 x86_64 x86_64 x86_64 GNU/Linux 리눅스 커널의 버전 ..

[Linux] 톰캣 리눅스(Linux) Profile 지정 [내부링크]

tomcat/bin 디렉토리 setenv.sh 파일 생성 후 아래 값 작성 JAVA_OPTS="$JAVA_OPTS -Dspring.profiles.active={profile_name}" 예시 JAVA_OPTS="$JAVA_OPTS -Dspring.profiles.active=prod" 다중 profiles 지정 JAVA_OPTS="$JAVA_OPTS -Dspring.profiles.active=local,prod" 참고사이트 https://jdm.kr/blog/81 https://feco.tistory.com/106

[HTML, Jquery] title 속성에 유효한 태그 적용 [내부링크]

c서론 tilte 속성에 html 태그를 적용하려 했지만, 생각처럼 바로 되지 않았어서 글작성..! 본론 기존 위와 같이 < > 와 같은 특수코드를 이용하여 태그를 만들어주었다. 하지만, 결과는 ... 위와 같이 태그가 그대로 나오게 되었다. tilte을 바로 출력하면 태그가 적용이 안되는 것 같았다. 그래서 어떻게 할까 찾아보다가 괜찮은 걸 찾았다. 수정 후 1. body에 div를 만들어준다. 2. mouseover를 통해 호버 이벤트 this의 title을 가져온다. this의 title을 비운다. body에 추가했던 div에 title내용을 html로 적용한다. 3. mousemove를 통해 위치조절 div의 위치를 동적으로 변경시켜준다. 4. mouseout을 통해 마우스가 나왔..

[Java] 자바10부터 나온 var [내부링크]

서론 회사 내 모든 프로젝트가 자바8에서 자바11로 올리게 되었다. 그래서 현재 자바8 기준으로 되어 있는 소스코드들이 많았고, 자바 8 이후에 나온 기술들을 하나하나 도입을 준비 중에 있다. 이후 sonarQube(소나큐브) 라는 소스코드 품질을 높여주는 툴을 도입하게 되었고, 여기 이슈에서 var 관련 이슈가 엄청 많이 나왔다. 그래서 도입 전 var가 뭔지 어떻게 쓰면 좋은지에 대해 알아보고 결정해야 하기에 알아보게 되었다. c️자바8 이전과 자바10 이후 차이점 // 자바8 이전 String message = "Good bye, Java 9"; Map map = new HashMap(); // 자바10 이후 var message = "Hello Java 10"; var idToNameMap ..

[Java] Optional – orElse() vs orElseGet() 차이점 알고 쓰자. [내부링크]

* 2022.03.01 내용 수정 - orElse() 를 사용하는 경우 추가 - orElse() orElseGet() 작동원리 수정 서론 자바 8부터 지원하게 된 optional은 NullPointerException 에 대한 문제를 해결하기 위해 나왔습니다. 하지만 그런데도 null이 발생할 수 있고, null 체크를 해야만 하는 경우가 빈번합니다. 그러므로 null일 시 default 값을 넣어줄 수 있는데 그중에서 orElse()와 orElseGet() 이 존재합니다. 이를 그냥 이것저것 사용할 수도 있지만, 알고 쓰는 것과 모르고 쓰는 것은 천지 차이기 때문에 한 번 정리해보았습니다. c둘의 차이? public T orElse(T other) public T orElseGet(Supplier

[Java] Map getOrDefault 를 활용하자. [내부링크]

getOrDefault 를 모르기 전까지 방식 1. 일단 get으로 원하는 값을 가져오고, 2. 있는지 없는지 null 체크 하고, 3. null 이면 새로 만들어준다. getOrDefault를 안 이후 1. 가져오고, 없으면 새로 만들어준다. 분명 잘 쓰고 있다고 생각했지만, 내가 모르는 많은 라이브러리등이 존재한다.. 계속 알아갈 때 마다 재밌넹

[Java] ArrayList 조건 삭제 'removeIf' [내부링크]

서론 arrayList 경우 내가 삭제하고 싶은 애를 삭제하고 싶은 경우 for문을 돌리고, if문을 통해 삭제하는 경우가 있었다. 하지만 자바8부터 생긴 removeIf를 사용하면 람다식을 이용하여 간단하게 삭제할 수 있다. 본론 자바8에 생긴 람다 중 Predicate 를 사용하여 list에서 원하는 애를 삭제하는 방식을 이용하고 있다. 이는 stream에 있는 filter랑 같은 원리이다. 리턴 값은 boolean으로 하나라도 삭제가 되면 true, 삭제가 없으면 false를 반환한다. 예제 위처럼 removeIf를 통해 조건에 맞는 데이터들을 한 번에 정리할 수 있다.

[QueryDSL]like, contains 차이 [내부링크]

서론 회사에서 자체프레임워크를 사용하다보니 기본으로 제공되는 like와 contains를 잘 사용할 일이 없었다. 그러다 최근에 사용할 일이 있어 like를 사용하게 되었는데, 원했던 어디든 포함이 되는 like가 진행되지 않아 찾아보게 되었다. 본론 둘 다 쿼리가 날라가는 것은 LIKE로 날라가지만 contains는 앞 뒤로 %를 자동으로 붙여주고, ex) %튀김% like는 입력한 그대로 날라간다. ex) 튀김 사용 예 contains : 앞, 중앙, 뒤 상관 없이 문자가 포함이 되는지 확인하고 싶을 때 like : 앞, 중앙, 뒤 원하는 곳에 포함이 되는지 확인하고 싶을 때 직접 %를 붙여서 사용

[코드업] 기초100제 함께 문제 푸는 날(설명)(py) [내부링크]

d = 1 while d%a!=0 or d%b!=0 or d%c!=0 : d += 1 print(d) 이미 설명에 답이 나와 있었다. 그냥 따라하면 재미 없으니 조금 다른 방식으로 코드를 짜보았다. a, b, c = map(int, input().split()) num = (a if a > b else b) if ((a if a > b else b) > c) else c result = num while result % a != 0 or result % b != 0 or result % c != 0: result += num print(result) 반복문을 가장 적게 돌릴 수 있는 방법이 뭐가 있을까 고민하다가 최대 값을 찾아서 최대 값을 더해 찾는 방식으로 구현해보았다. 다른 사람들의 코드까지는 확인..

[PostgreSQL] CLOB타입과 TEXT타입 - JPA [내부링크]

c️서론 예전에 @Lob 에러 관련 글을 적은 적이 있다. 당시에는 postgresql에서 @Lob을 아예 사용할 수 없는 줄 알고 @Column(columnDefinition="TEXT") 사용을 무조건 해야 한다고 알고 있었지만 최근에 틀렸단 것을 깨닫고 글을 작성한다. ️LOB? CLOB? 그게 일단 뭐야! 간단하게 알려줘!! LOB - Large Objcts ------------ CLOB - Character LOBs : DB 내부에 존재하는 대용량의 텍스트 BLOB - Binary LOBs : Image, Sound, Video 등의 대용량의 DB내부에 존재하는 데이터 NCLOB - National Character LOBs : DB 내부에 존재하는 대용량의 내셔널 텍스트 BFILE ..

알고리즘 공부를 파이썬(python)을 선택한 이유 [내부링크]

c️ 사회초년생 첫 알고리즘 공부 시작 (지금까지 게을렀던 나..) - 취업까지 학교에서 연계된 회사와 잘 마무리가 돼서 코딩테스트 한 번 없이 취업에 골인했다. 물론 그 전에는 공부해야지 공부해야지 했지만... 현재가 바쁘단 핑계로 미뤄두었다가 취업까지 하고.. 현재까지 왔는데. 미리 공부를 안 해두면 좋은 기회가 오더라도 면접 전 입장 문도 못 넘을 것 같단 생각에 이제라도 준비하려한다. c️ 어떤 언어로 공부할까? 내가 지금까지 해본 언어라고는 js, java 그리고 현재 학교에서 기초만 배운 python이었다. 세 가지를 가지고 고민하고 있었고 그래도 python이 코테로 가장 쉽고, js가 java보단 쉽다라는 풍문은 어디서 주워들은 기억이 있어서 python과 js로 고민을 했고, 그래..

[SPRING] feign은 뭘까? [내부링크]

c 서론 다른 서버와 통신을 하기 위한 API 를 설계 및 개발을 하면서 알게 된 feign에 대해서 정리하기 위해 작성하게 되었다. 그 전까지는 spring에서 다른 서버를 호출해본 적이 없었기 때문에 어떻게 하는지에 대한 궁금증이 있었는데 이번 기회에 알게 될 수 있었다. c️ feign은 그래서 뭔데! - Netflix에서 만든 HTTP client binder로서 기존 http client 작성을 쉽게 만들어주는 라이브러리이다. - interface를 작성하고 annotation을 붙여서 쉽게 사용할 수 있기 때문에, HTTP API를 균일하게 바인딩하여 복잡성을 줄여준다. - 이전에는 RestTemplate 방식과 WebClient 방식이 존재했지만 현재 스프링 커뮤니티에서는 RestTemp..

[QueryDSL] 표현식 정리 [내부링크]

queryDSL을 작성할 때 자주 안 쓰는 친구들은 쓸 때마다 헷갈려서 공식사이트에서 그대로 가져와봤습니다. //Standard Alternative expr isNotNull expr is not(null) expr isNull expr is null expr eq "Ben" expr === "Ben" expr ne "Ben" expr !== "Ben" expr append "X" expr + "X" expr isEmpty expr is empty expr isNotEmpoty expr not empty // boolean left and right left && right left or right left || right expr not !expr // comparison expr lt 5 expr ..

[SPRING]@Transactional Annotation 알고 쓰자 [내부링크]

- 첫 작성일 : 21년 3월 21일 velog 블로그 1. 서론 초반 @Transactional 어노테이션에 대해 자세히 알아보지 않고, 막연히 롤백때 사용한다고 하여 SQL C,U,D 를 할 때마다 메소드 위에 붙여서 사용하곤 하였다. 하지만, 내 코드를 보신 선임께서 단지 @Transactional 만 붙이면 롤백이 안되고, @Transactional(rollbackFor = Exception.class) 을 붙여야 된다고 알려주셨다. 여기에서 뭐 때문인지에 대해 호기심에 트랜잭션에 대해 찾아보다가 내가 생각했던 것 보다 더 많은 기능들이 존재한다는 것을 알고 정리해보려 한다. 2. 트랜잭션이 뭐지? 데이터베이스의 상태를 변경하는 작업 또는 한번에 수행되어야 하는 연산들을 의미한다. begin, c..

[Java]예외(Exception)관련 정리 [내부링크]

- 첫 작성일 : 3월 20일 velog 블로그 서론 트랜잭션에 대해 공부하다보니 예외를 빼놓을 수 없어서 한 번 정리한다. 예외(Exception) 란? 예외는 크게 두 종류로 나뉘게 된다. Checked Exception 와 Unchecked Exception 그리고 예외와 별개로 오류(Error)가 있다. 예외란 개발자가 로직을 잘못 짰거나 혹은 사용자가 잘못된 값을 넘겨 정상적인 프로그램 흐름에 벗어나는 행위를 말한다. 그래서 미리 예측을 하여 예외를 잡을 수 있다. 오류는 하드웨어에서 문제가 발생하는 경우도 있고, 완전 잘못된 로직을 짠 경우 등 시스템 레벨에서 발생하는 비정상적인 행위이기 때문에 이를 미리 예측해서 막을 수도 신경을 쓸 필요도 없다. Checked Exception / Unch..

[JPA] PostgreSQL @Lob 에러 [내부링크]

- 첫 작성일 : 21년 2월 14일 velog 블로그 @Lob 이란? JPA 어노테이션 중 하나로 db 문자열을 길이제한 없이 text로 사용할 수 있도록 연결해주는 녀석입니다. 버그내용 PostgreSQL에서 @Lob을 사용하여 get으로 정보를 불러올 때 Large Objects in auto-commit mode 와 같은 에러가 발생하게 됩니다. 해결방법 @Lob 대신 @Column(columnDefinition="TEXT") 사용 2021-04-23 추가내용 kdhyo98.tistory.com/35 [PostgreSQL] CLOB타입과 TEXT타입 - JPA c️서론 예전에 @Lob 에러 관련 글을 적은 적이 있다. 당시에는 postgresql에서 @Lob을 아예 사용할 수 없는 줄 알고 @..

[Java]BeanUtils.copyProperties를 사용해보자 [내부링크]

- 첫 작성일 : 21년 2월 11일 velog 블로그 BeanUtils.copyProperties ? 스프링에서 제공해주는 메소드로서 객체를 쉽고 간결하게 복사할 수 있게 해준다. 언제 사용하지? 예를들어 객체를 수정하기 위해 파라미터로 값을 받았을 때 필드가 많으면 많을 수록 setter의 횟수가 늘어나고 코드의 길이도 늘어나기 때문에 가독성과 소요시간이 떨어지게 됩니다. 이때 BeanUtils.copyProperties 메소드를 통해 한줄로 해결할 수 있습니다. 또한, 그대로 복사하지 않고 변경하지 않은 것들을 선택해서 원하는 것만 복사하고 싶을 때에도 사용하면 좋습니다. 사용방법 copyProperties(Object source, Object target) source - 원본 객체 target..

[Java]String Format 사용법 [내부링크]

- 첫 작성일 : 21년 1월 17일 velog 블로그 Stirng Format 문자열의 형식을 원하는대로 표현해주는 메소드로 유용하게 사용되고 있다. 표현가능한 데이터 타입 모든 인수 적용 가능(ex - stirng, int, Integer, Boolean ...) %b (인수가 null이면 false 아니면 true 반환 / Boolean) %h (인수가 null이면 null 아니면 16진수 반환 / Integer.toHexString) %s (인수가 null이면 null 아니면 문자열 반환 / toString()) 숫자 (char, Character, byte, Byte, short, Short, int, Integer) %c (char, byte, short ... 을 받아 유니코드로 반환) 정수..

[PostgreSQL]COUNT 사용 시 주의 [내부링크]

- 첫 작성일 : 21년 1월 10일 velog 블로그 c 서론 ('~이다'로 끝내는 것은 글을 편하게 쓰기 위해서이니 양해바랍니다.) 이 글은 postgresql 문법으로 작성되었지만 다른 sql에서도 주의해야 할 사항이다. 회사에서 COUNT를 사용하다가 생각했던 값과 다르게 나오는 것을 발견되었다. 과장님께서 간단하게 해결책을 제시해주셨고, 그 방법을 기록할 생각이다. count COUNT 란 해당하는 조건(없어도 가능)에 원하는 컬럼 값이 존재하는지 확인하여 존재하는 것의 총 개수를 확인하는 문법이다. 위 테이블에서 contents에 내용이 있는 것들의 개수를 알아보기 위해 COUNT를 사용한다. 내가 원하는 답은 값이 들어있는 것의 합인 '6'을 원한다. 8???? 결과는 생각과는 다르게 8..

[Java]Apache? Tomcat?? 둘이 무슨 차이지? [내부링크]

- 첫 작성일 21년 1월 1일 velog 블로그 서론 학교에서 php를 하고, 회사에서 spring boot + jsp를 사용하면서 아파치 톰캣을 자연스럽게 사용하게 되었다. 하지만, 사용하는 동안 이게 도대체 무엇이길래 웹을 할 때 많은 곳에서 사용하는지? 이게 정확히 무엇을 해주는건지? 에 대해 많은 궁금증을 가지면서 하다가 이번 기회에 공부를 하면서 정리를 해본다. 아파치(Apache) (아파치 검색을 해보면 AH-64(아파치) 헬기가 가장 많이 나오길래 한번 가져와봤습니다..) 우리가 흔히 아파치라고 부르는 것은 Apache HTTP Server를 의미하는 데 이는 오픈 소스 소프트웨어 그룹인 아파치 소프트웨어 재단(Apache Software Foundation, ASF)에서 만든 웹서버 프..

[SPRING] lombok 활용 [내부링크]

Lombok 이란 자바 Model(DTO, VO, Domain)에서 반복적으로 만들어야하는 것들을(Getter/Setter...) 어노테이션을 통해 코드의 줄을 줄여주고, 가독성을 높이는 데에 굉장한 도움을 주는 라이브러리 입니다. 간단한 예제를 먼저 보여드리겠습니다. Getter / Setter 기존방식 경우 위처럼 객체를 사용하기 위해 배가 되는 줄을 반복적으로 만들어야하는 일이 빈번히 발생하곤 합니다. 위처럼 getter와 setter를 비롯하여 toString, Builder 등을 더 만들게 되면 더 많은 줄이 생기게 될 것입니다. 이를 매우 간편하게 줄여주는 도구가 lombok입니다. 위처럼 불필요한 줄들을 줄여 가독성면을 높이게 됩니다. 오른 쪽 면을 보시면 getter와 setter가 ..

[Java]기본형과 참조형 두 종류의 타입 [내부링크]

기본형(primitive type) 타입 메모리 크기 기본 값 데이터의 표현 범위 논리형 boolean 1 byte false true, false 정수형 byte 1 byte 0 -128 ~127 short 2 byte 0 -32,768 ~32,767 int 4 byte 0 -2,147,483,648 ~ 2,147,483,647 long 8 byte 0 -9,223,372,036,854,775,808 ~ 9,223,372,036,854,775,807 실수형 float 4 byte 0.0F (3.4 X 10-38) ~ (3.4 X 1038) 의 근사값 double 8 byte 0.0 (1.7 X 10-308) ~ (1.7 X 10308) 의 근사값 문자형 char 2 byte '\u0000' 0 ~ 65..

[JavaScript]두 배열 안에 오브젝트를 비교 후 중복된 값 제거 [내부링크]

서론 --- 몇 시간동안 고민 후 일단 짠 다음 과장님께 코드리뷰를 부탁드려서 결국 사내 라이브러리를 통해 내가 짠 코드보다 몇 배는 간결하게(거의 2~3줄로 끝낸..) 끝을 내는 방법을 찾아 해결을 하긴 했다. 하지만, 회사 라이브러리 없이 어떻게 짜는 방법이 간결한지 궁금해서 기록 느낌으로 일단 짠 코드를 올려서 나중에 다시 이런 일이 있었을 때 보고 예전엔 저렇게 짰었구나 생각하기 위한 글. 본론 --- 오브젝트로 구성된 배열이 A, B가 있다. 오브젝트 안에 있는 name, address 두 가지를 같이 비교를 하여, B와 같은 name, address가 A에 있는지 확인하여 A에 있다면 A에서 그 오브젝트를 제거하는 로직 내가 생각한 방식은 새로 배열을 만들어서 일단 무조건 넣고, 중복된 걸 찾..

[SQL]IN / NOT IN / EXISTS / NOT EXISTS 은 어떻게 쓰는걸까? [내부링크]

특정 컬럼만 혹은 특정 컬럼만 제외하고 보고 싶을 때엔 IN / NOT IN / EXISTS / NOT EXISTS 이런 명령어를 사용하여 하곤 합니다. 위와 같은 명령어들은 하나의 테이블에서도 가능하고, 두 개의 테이블에서도 사용이 가능합니다. 하지만! 속도면에 있어서 두 개 이상의 테이블에서 사용할 경우 별로 좋지 않기에 JOIN을 통해서 해결하시는 방법을 추천드립니다. --- 1. 간단하게 생각했을 때에 개념잡기! IN / EXISTS => 조건에 부합하는 결과를 찾습니다. NOT IN / NOT EXISTS => 조건에 부합하는 결과를 제외시킵니다. 2. 그래도 둘의 차이점은? IN : 서브쿼리를 먼저 검색 -> 결과 목록 형성 -> 쿼리에서 하나하나씩 리스트 요소에 부합하는지 찾기 EXISTS ..

[QueryDSL] Date 별 Group By 는 Expressions.dateTemplate !! 혹은 StringTemplate ?? [내부링크]

서론 --- 회사에서 일 별 합계를 구해야 하는 페이지를 제작 중에 시간까지 저장되어 있는 쿼리를 어떻게 변환하여 적용하는 지에 대해 꽤 오랜 시간을 찾다가 깨닫게 되어서 글을 작성해본다. 본론 -- dsl에 있는 메소드인 'Expressions.stringTemplate' 를 사용하면 된다. DateTemplate formattedDate = Expressions.dateTemplate(LocalDateTime.class, "DATE_FORMAT({0}, {1})", qItem.loadDt, "%d/%m/%Y"); DateTemplate formattedDate = Expressions.dateTemplate(LocalDateTime.class, "DATE_FORMAT({0}, {1})", qItem...

left outer join ? [내부링크]

첫 번째 테이블은 조건과 관계없이 모두 결합된다. SELECT [열 목록] FROM [첫 번째 테이블] LEFT OUTER JOIN [두 번째 테이블] ON [조인될 조건] WHERE [검색 조건] 예시) select a.* , b.device_id from simple_check_list a left outer join (select * from simple_device_check where device_id = #{deviceId}) b on b.check_list_id = a.check_list_id where a.device_type_id = #{deviceTypeId} ------------------------------------------------------ select a.* , b.d..

express.use 메소드 [내부링크]

app.use([path,] callback [, callback...]) 1. 패스가 지정되어 있지 않기 때문에 모든 경로에서 계속 호출 app.use(function (req, res, next) { console.log('Time: %d', Date.now()) next() }) 2. '/abcd' 경로에 들어왔을 때만 실행 app.use('/abcd', function (req, res, next) { console.log('Time: %d', Date.now()) next() }); 참고주소

[Prisma2] ON DELETE CASCADE는 어떻게 하는건가! [내부링크]

www.prisma.io/docs/getting-started/setup-prisma/start-from-scratch-sql-node-mysql Start from scratch (Node.js & MySQL) Learn how to create a new Node.js or TypeScript project from scratch by connecting Prisma to your database and generating Prisma Client for database access. www.prisma.io Prisma2를 배우면서 위에 사이트에서 보면서 따라하는 것을 해보았다. 하는 도중에 막히는 부분이 있어서 글로 남겨본다. 거의 막바지에 delete를 하는 부분이 있었는데 아래 에러가 발생하였..

'Graphql'을 선택한 이유 [내부링크]

이번 프로젝트를 시작하기에 앞서 graphql에 접하게 되었다. 하는방법이나 연습은 Nomad Coders와 howtographql를 통해 쉽게 접할 수 있었다. 지금까지 REST API로 작업하면서 느꼈던 불편함들을 graphql을 통해 해소할 수 있었으며, 코드의 간결함, 보기쉽고 백과 프론트가 주고받기 쉬움 등 여러 장점이 있었다. 내가 느낀 장점과 해외사이트에서 소개한 장점들을 설명하면서 Graphql이 왜 주목을 받는지 정리를 해볼 예정이다. 일단 'Graphql'은 Fackbook에서 만든 오픈소스 쿼리언어입니다. 현재 전 세계에 있는 대기업 및 개인커뮤니티에서 관리를 하며 빠른 성장세를 유지하고 있습니다. 오랫동안 유지해오던 REST API의 대안으로 나온 Graphql이 이토록 무서운 성장..

[GraphQL] Over-fetching과 Under-fetching? [내부링크]

기술스택을 늘리고 싶다는 생각만으로 GraphQL을 공부하려고 했다. 하려고 찾아보니 기존 RESTAPI에 있는 문제점인 Over-fetching과 Under-fetching를 해결하기 위해 나온 API 쿼리언어라는 것을 알게 되었다. 그럼 Over-fetching과 Under-fetching이 뭔지 알아야 좀 더 효율적으로 사용할 수 있을 것 같아 정리를 해보려고 한다. Over-fetching API를 호출 시 필요없는 데이터(?) 사용하지 않을 데이터까지 딸려오는 것을 말한다. 만약 내가 유저의 정보 중에서 유저의 이름만을 원한다고 하면 어떨까? { user: [ { "id": 1, "name": "dong", "email": "naver.com", "age" : 23, }, { "id": 2, "..

[일기]async await 비동기 방식 처리 [내부링크]

http://kdhyo.kr Mapstival Best Travel with a map Start kdhyo.kr 첫 프로젝트로 축제사이트를 만들었을 당시 nodejs와 자바스크립트에 대한 어떻게 만지는지에 대해서만 배운 후 바로 만들었던 작품이었다. 그 당시에 축제 API를 불러오는 과정에서 비동기방식으로 처리를 해야된다는 이야기를 듣고, 어떻게 불러오고, 어떻게 비동기 방식으로 처리해야되는지 감이 안오는 상태에서 이것저것 검색을 해보았을 때 promise와 axios 그리고 async await에 대한 단어들을 알게 되었고 그것들을 실제 적용을 하였다. 적용을 하고 보니 정상적으로 api들이 가져와진걸 보고 "아 비동기처리 했다!" 라고 생각을 했다. 그 당시엔 비동기 처리가 뭔지.. 우리 사이트에 ..

[JavaScript]프로트타입(Prototype) ?? [내부링크]

프로트타입은 자바스크립트에서 어쩌면? 가장 핵심적인 내용이라고도 볼 수 있습니다. '함수는 객체다.' 라는 말을 들어보셨을 겁니다. function a(x, y) { return x - y; } a.add = "No add"; console.log(a.add); 이런 식으로 add를 추가시켜서 Key/Value 를 가질 수 있습니다. 추가를 시킬 수도 있지만 기존에 있던 것들도 사용할 수 있습니다. 평소에도 많이 보셨던 a.name, a.length 등 이렇게 사용할 수 있는게 바로 함수가 객체이고 자바스크립트가 프로트타입 방식이기 때문입니다. 예제와 이미지를 통해 설명을 하면 이해하기 더 쉽겠지만 이번 포스팅에선 간단하게 글로만 제가 이해한 것을 바탕으로 적어만 두고, 나중에 한번 수정할 예정입니다. ..

[JavaScript] 실행 컨텍스트(Execution Context) 간단 설명 [내부링크]

실행 컨텍스트(Execution Context) ECMAScript에서 실행컨텍스트의 정의를 이렇게 말한다. '실행 가능한 코드를 형상화하고 구분하는 추상적인 개념' 좀 더 쉽게 설명을 하자면 이렇다. '함수가 실행될 때 그 함수의 대한 환경 정보들을 모아 메모리에 저장' 실행 컨텍스트는 호이스팅, 스코프, this, 클로저, 함수 등의 동작원리를 담고 있는 자바스크립트의 핵심원리이다. 그러므로 실행 컨텍스트는 확실하게 이해하고 넘어가는 것이 좋다. 콜스택(Call Stack) 자바스크립트 엔진은 실행되는 코드들을 순차적으로 스택에 쌓아 위에서부터 하나씩 처리를 하는 LIFO(Laast In First Out)방식으로 함수들을 실행하게 된다. 실행 컨텍스트의 종류 Global Execution Conte..

[JavaScript] var, let, const ? [내부링크]

ECMAScript2015에서 let과 const가 등장한 이후로 개발자들이 var 대신 let, const를 주로 활용하고 있습니다. 자바스크립트의 장점이자 어찌보면 단점이라고도 생각되는 유연성을 let과 const가 그 단점을 보안해주는 역할을 합니다. 이제 var와의 차이점을 하나씩 알아보겠습니다. var : function-scoped let, const : block-scoped var는 함수를 기준으로 스코프가 생성이 되며, let과 const는 블록을 기준으로 스코프가 생성됩니다. if(true){ var a = 2; } console.log(a) if(true){ let a = 2; } console.log(a) 위에 var로 선언한 a변수는 정상적으로 콘솔에 나타나는 반면, let으로 선..

[JavaScript] 클로저(closure) 정의 [내부링크]

클로저(closure) 자바스크립트에서 클로저의 정의는 정확히 내려지지 않았습니다. 그래서 사람들마다 책마다 블로그마다 클로저의 정의를 말하는게 조금씩 다릅니다. 제가 공부하면서 생각한 정의는 이런 느낌입니다. '이미 생명주기가 끝난 함수의 변수를 참조할 수 있도록 해주는 현상' function outer () { let a = 0; function inner () { return ++a } return inner; } const func = outer(); console.log(func()); console.log(func()); console.log(func()); 위 코드를 실행하면 결과는 1 2 3 이 나오게 됩니다. 이걸 이해하려면 일단 '실행 컨텍스트'를 이해하셔야 합니다. func에서 out..

[JavaScript] 스코프(Scope)는 뭘까? [내부링크]

스코프는 우리 말로 번역을 하면 '범위'라는 뜻이다. 자바스크립트에서 스코프는 '접근할 수 있는 범위'라고 생각하면 된다. 아래 예제들을 보면서 이해하는게 가장 쉬울 거라 생각한다. const a = "Hello"; function b() { console.log(a); } b() 위처럼 b함수를 실행하게 되면 b함수에 a라는 변수가 없지만 전역에 있는 a라는 변수를 가져와 "Hello"를 출력 할 수 있게된다. 아래 코드는 어떨까? const a = "Hello"; function b() { console.log(a); const a = "bye"; } b() 여기서의 콘솔에는 어떤게 찍힐까? 바로 'undefined'가 출력되게 된다. 위 코드를 이해하지 못했다면 호이스팅 에 대한 포스팅을 읽고오는 ..

[JavaScript] Hoisting은 뭐지? [내부링크]

Hoist - 들어올리다. 호이스트(Hist)는 건축/건설에서 사물을 끌어올릴 때 쓰이는 도구를 부르는 말이기도 하다. javascript에서의 호이스팅은 선언된 모든 변수와 함수들을 그 스코프 안에서 최상단으로 끌어올리는 것을 의미한다. 간단한 예를 들어서 보여주는게 이해하기 가장 쉬울 것 같다. var a = 2; consol.log(a); 결과 : 2 consol.log(a); var a = 2; 결과 : undefined 위처럼 변수선언은 최상단으로 올리기 때문에 a가 아래에서 선언이 되었어도 위콘솔에서는 undefined를 가지게 된다. '함수 선언식' 함수 또한 통째로 위로 호이스팅을 시키기 때문에 아래에서 선언을 해도 위로 끌어올리게 된다. a(); function a() { console...

[JavaScript] '=='와 '==='의 차이점? [내부링크]

최근 js를 기초부터 바닐라js부터 다지자는 생각으로 공부 중이었다. 그러던 와중 예전부터 궁금했지만 지나치던 것들을 하나하나 이해하면서 블로그에 올리면서 정리하잔 생각이 들었다. 그런 생각을 하던 중에 발견한 한 사진을 보고 찾아보기 시작했다. 대학교나 그 전부터 C, C++, JAVA 등 다른 언어들도 기초(?)정도를 공부했던 난 JavaScript에서 '==='란 등호를 보고 저게뭐지..?란 생각을 했었고, 사람들에게 물어보면 "그냥 '=='보다 '==='가 더 정확하니까 '==='를 쓰는게 좋아"라고 막연하게 알려주곤 했다. 물론 나도 그렇게만 받아드렸다. 그래서 한 번 오늘 찾아보고 이해하게 되어 정리를 해본다. MDN에서는 이렇게 설명해주었다. JavaScript는 엄격한 비교와 형변환 비교 ..

[JavaScript] ES5 메소드인 map()과 forEach()의 차이점은? [내부링크]

최근 인프런 강의 중 하나인 '__따라하며 배우는 노드, 리액트 시리즈 - 쇼핑몰 사이트 만들기' 를 연습하고 있다. 그러던 와중 map()과 forEach()이 자주 등장하는데 눈으로 보기엔 기능이 거의 비슷한데 어떤 상황에서 어떤걸 써야 더 맞는건지? 반대로 써도 되는지? 왜 굳이 비슷한 기능이 두개가 있는가? 에 대해서 궁금해지기 시작했다. 그래서 알아봤고, 정리를 해야겠다고 생각했다. --------------------------------------- 간략 설명하자면, forEach()과 map()에 가장 큰 차이점은 리턴값의 유무인 것 같다. map()은 리턴값이 있으며 forEach()은 리턴값이 존재하지 않는다. 가볍게 소스코드를 한번 보면서 위에 간략 설명을 풀어서 정리를 해보겠다. 아..

쇼핑몰사이트 클론 시작 [내부링크]

인프런 강좌를 통해 쇼핑몰사이트 제작을 해보려 한다. 사실 졸업작품 때 도움이 될까 싶어 강좌를 사두었지만.. 졸작에 필요한 것만 구글링으로 만들다 보니 이제 시작하게 되었다. 오늘 시작하려고 하는데 갖가지 오류가 뜨는 바람에 문제가 많이 생겨서 보일러플레이트를 다운 받아 git에 올리는 것 까지밖에 하지 못했다.. 이 오류때문에 몇 시간을 날려먹었는지 모르겠다... 오류는 당연히 'bcrypt'가 제대로 설치돼지 않아 발생하는 거라는데 몇 번을 재설치하고 파일을 다시 다운받아도 'npm install'에서 막혔다... 한시간이 지났나 꾸준히 구글링해보니 비쥬얼스튜디오 c++인가 관련된 걸 다운받으라는 주소가 있길래 이왕 까는 김에 비쥬얼스튜디오 정보를 거의 다 다운받았다.. (이거 다운 받는 데 거의 ..

일단은 도메인 먼저. [내부링크]

예전부터 하고 싶었던 개인 도메인 개설 - 호스팅닷케이알에서 kdhyo.kr 로 구매 예전부터 하고 싶었던 개인 이메일 개설 - 다음에서 '스마트 워크'라는 것을 이용하여 연결 예전에 'thunderbird'를 썼던 생각이 나서 연결 - 글을 쓰는 와중에 '스마트 워크'와 '호스팅닷케이알' 연결이 끝이 나서 썬더버드와 연결을 해보았다. 다음에 포트폴리오를 만들면 저 도메인에 연결까지 해보아야겠다. ps. 사실.. 리액트 기본 구조까지 만들어서 올릴까 했었는데 생각보다 도메인연결이 늦게 끝나서 내일해야징~