전체 글

전체 글

    [Spring Cloud] Spring Cloud Bus와 메시지브로커 연동 (1)

    Spring Cloud Bus P2P Message Broker RabbitMQ vs Kafka Spring Cloud Bus 분산 시스템의 노드를 경량 메시지브로커와 연결 상태 및 구성에 대한 변경사항을 연결된 노드에게 전달한다. (Broadcast) 여기서 노드는 마이크로 서비스를 뜻한다. 대표적인 메시지브로커는 RabbitMQ, Kafka, ActiveMQ 가 있다. 그렇다면 피투피와 메시지브로커는 어떤 차이가 있을까 Peer-to-peer 피투피는 메인 서버를 거치지 않고 서버에 연결된 클라이언트끼리 직접 통신하는 방식이고 주로 블록체인 기술이나 게임 서버에 많이 활용된다. 현재 재직중인 직장의 블록체인 메인넷은 피투피 방식으로 되어있다. 메인넷 CLI에 listpeers라는 명령어가 있는데, 클..

    [JPA] 다중 Unique 제약조건 생성하기

    Unique 제약 조건 Unique 제약조건이 있는 컬럼은 모든 값이 고유하도록 만들 수 있습니다. 예시 create table NFT ( NFT_ID bigint primary key auto increment, NFT_NAME varchar(25) unique, ) comment 'NFT 정보'; NFT 테이블에서 NFT_NAME은 중복되면 안됨으로 Unique 제약조건을 추가할 수 있습니다. 다중 Unique 제약 조건 다중 Unique는 여러 컬럼을 묶어서 Unique로 만드는 제약조건입니다. 예시 create table NFT ( NFT_ID bigint primary key auto increment, NFT_NAME varchar(14) not null, NFT_SUB_NAME varchar..

    [디자인 패턴] 팩토리 메서드 패턴

    팩토리메서드는 부모 클래스에서 객체를 생성하는 인터페이스를 제공하고, 자식 클래스들이 생성될 객체들의 유형을 변경할 수 있도록 하는 생성패턴입니다. 문제 트럭 운송만 처리 가능한 대부분의 코드가 'Truck' Class에 있습니다. 얼마 후 해상 물류 기능을 추가해 달라는 요청이 수십 개씩 받기 시작했다고 가정해 봅시다. 현재 대부분의 소스코드가 'Truck' Class에 결합되어 있기 때문에 'Ship' Class를 추가하려면 전체 코드 베이스를 변경해야 할 것입니다. 해결 운송 매체에 관한 인터페이스 'Transport'를 만들고 'Truck'와 'Ship' 등 수단 클래스가 Transport를 구현시키게 합니다. Truck과 Ship은 각각 트럭 운송, 해양 운송을 맡게됩니다. 예시 public i..

    Effective Java를 읽으며 코드 리펙토링

    이펙티브자바의 목차 생성자 대신 팩토리 메서드를 고려해라 Item: Consider static factory methods instead of constructors 장점 1. 이름을 가질 수 있다. package com.everyparking.api.dto; import lombok.Builder; import lombok.Data; import org.springframework.http.HttpStatus; @Data @Builder public class DefaultResponseDtoEntity { private String message; private Object data; private HttpStatus httpStatus; private DefaultResponseDtoEntity(..

    [Spring Boot] 요청, 응답 시 Json에 루트 추가하기

    RealWorld로 스프링부트를 공부하던 중 다음과 같은 Json 포맷을 발견했다. Request Format { "user": { "email": "jake@jake.jake", "password": "jakejake", "username": "jake" } } 위와 같이 "user"로 VO를 한번 감싸는 방식의 요청이다. Response Format { "user": { "email": "jake@jake.jake", "token": "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzdWIiOiJqYWtlIiwiZXhwIjoxNjYzOTk2NTA4LCJ1c2VybmFtZSI6Impha2UifQ.W3h0uxdWyvIgbgaG1nqfCsIcvyIG06gZhUT95YVNPCs", ..

    객체지향의 사실과 오해를 읽으며 코드 리팩토링

    http://www.yes24.com/Product/Goods/18249021 객체지향의 사실과 오해 - YES24 『객체지향의 사실과 오해』는 객체지향이란 무엇인가라는 원론적면서도 다소 위험한 질문에 답하기 위해 쓰여진 책이다. 안타깝게도 많은 사람들이 객체지향의 본질을 오해하고 있다. 가장 www.yes24.com "객체지향의 사실과 오해"는 인프런 김영한님의 JPA강의에서 추천한 책이다. 사람은 자동차 문을 열면 안된다. 객체지향에서는 자동차도 객체이기 때문에 사람이 자동차에게 문을 열어달라고 요청해야한다. 자동차가 예외를 확인한 후 문을 여는 것이 옳다. 위 내용을 읽고 나의 코드를 리팩토링 해봤다. 기존 코드 도메인 @Getter @NoArgsConstructor @AllArgsConstruct..

    [학교 관리 프로젝트] 도메인 단위 테스트와 테스트 코드를 가독성있고 빠르게 작성하는 방법

    테스트할 도메인은 아래 포스트를 참고하자. 2022.08.31 - [학교 관리 서비스 프로젝트] - [학교 관리 프로젝트] UserDetails를 구현한 User 도메인, @Query를 사용한 JPQL과 서비스 코드 구현 [학교 관리 프로젝트] UserDetails를 구현한 User 도메인, @Query를 사용한 JPQL과 서비스 코드 구현 UserDetails.java UserDetails를 상속한 클래스는 Abstract하거나 아래의 메서드를 완성시켜야한다 반환타입이 boolean 값인 메서드는 이 계정이 유효한지 판단하는 메서드다. 접속한지 90일이 지났거나, 신 tae-wk.tistory.com 한글 메서드 명 사용하기 실무에서 사용할지 모르겠지만, 나의 경우 테스트 코드의 메서드 명은 주로 한글..

    [JUnit] - JPA · MySQL 테스트 Failed to load ApplicationContext 트러블 슈팅

    Failed to load ApplicationContext ApplicationContext load를 실행한 원인은 다양하다 JpaTest중 예외가 발생했다면 이 글을 참고하자. h2같은 인메모리 데이터베이스 또는 DERBY, HSQL를 사용하는 테스트에서는 아마 만날 있이 없을 것이다. IllegalStateException or NullPointerException 테스트 중 datasource를 불러오지 못했다면 전자, JpaRepository를 상속한 객체에 접근했다면 후자일 것이다. 자세한 에러 원인은 아래에서 보고 우선 해결 방법부터 설명하겠다. @DataJpaTest @AutoConfigureTestDatabase(replace = AutoConfigureTestDatabase.Repla..

    [Spring Security] BasicAuthenticationFilter와 TestRestTemplates을 사용한 테스트코드 작성

    적용하는 방법 @EnableWebSecurity(debug = true) @EnableGlobalMethodSecurity(prePostEnabled = true) public class SecurityConfig extends WebSecurityConfigurerAdapter { @Override protected void configure(HttpSecurity http) throws Exception { CustomLoginFilter filter = new CustomLoginFilter(authenticationManager()); http .httpBasic() } } BasciAuthenticationFilter를 설정하는 방법은 http의 Basic 옵션을 enable 시켜주면 된다. B..

    [Intellij] 유용한 단축키와 LiveTemplates, CodeTemplates

    코딩을 매일같이 하다보면 알게 모르게 단축키에 익숙해지고 마우스로 손이 안올라가더라 (VIM을 사용했다면 어땟을지 궁금하긴함.) 내가 자주 사용하는 단축키를 공유하려고 한다. Home, End, Pageup, PageDown는 노트북마다 위치가 달라 제외했다. 키 설명 컨트롤 Ctrl 알트 Alt 쉬프트 Shift 탭 Tab 단축키를 설명하면서 가독성을 위해서 영어가 아닌 한글로 글을 작성한다. 인텔리제이 단축키 컨트롤 + 알트 + L 인덴트에 맞게 코드를 정리한다. do~while과 if~else문에서 유용하고 람다식이나 stream을 다룰 때 편하다. 자주 사용하니 vscode, sublime text 하다하다 메모장에서도 습관적으로 누른다. 알트 + 방향 키 한 파일에 메서드가 많을 때 다음 메서드..

    [AXIOS ERROR] - 스프링 서버와 AXIOS를 사용한 통신할 때 발생하는 ERR_NETWORK 해결하기

    ERR_NETWORK를 해결하는 세 가지 방법 CrossOrigin 어노테이션 사용하기 @CrossOrigin("*") @Slf4j @RestController @RequestMapping("/api") @RequiredArgsConstructor RestController 최상단에 @CrossOrigin을 추가하고 와일드 카드를 붙이자. Config 패키지에 WebMvcConfigurer추가해서 Cors 설정하기 @Configuration public class WebMvcConfig implements WebMvcConfigurer { @Override public void addCorsMappings(CorsRegistry registry) { registry.addMapping("/**") .al..

    [게시판 RESTful API] - RestController와 Service를 구현해보자 (3)

    https://tae-wk.tistory.com/53 [게시판 RESTful API] - domain을 만들며 Entity를 알아보자. 1. 게시판을 저장할 POST 엔티티를 만들어준다. @Data @AllArgsConstructor @NoArgsConstructor @Builder @Entity @JsonNaming(PropertyNamingStrategy.SnakeCaseStrategy.class) public class Post { @Id @Genera.. tae-wk.tistory.com 프로젝트 세팅과 domain을 작성하는 방법은 위 포스트를 참고하면된다. 1. RestController package com.developer.controller; @RestController @RequestM..

    [게시판 RESTful API] - domain을 만들며 Entity를 알아보자. (2)

    1. 게시글을 저장할 Post 엔티티를 만들어준다. @Data @AllArgsConstructor @NoArgsConstructor @Builder @Entity @JsonNaming(PropertyNamingStrategy.SnakeCaseStrategy.class) public class Post { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; @Column(name = "POST_TITLE") private String title; @Column(name = "POST_CONTENT") private String content; @Column(name = "POST_AUTHOR") private String aut..

    [게시판 RESTful API] - 프로젝트 세팅 (1)

    1. build.gradle 의존성 세팅 plugins { id 'org.springframework.boot' version '2.7.2' id 'io.spring.dependency-management' version '1.0.12.RELEASE' id 'java' } group = 'com' version = '0.0.1-SNAPSHOT' sourceCompatibility = '11' configurations { compileOnly { extendsFrom annotationProcessor } } repositories { mavenCentral() } dependencies { implementation 'org.springframework.boot:spring-boot-starter-we..

    [프로그래머스 2단계 - 더 맵게] 효율성 풀이과정

    https://programmers.co.kr/learn/courses/30/lessons/42626?language=java 프로그래머스 코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요. programmers.co.kr 제가 정말 좋아하는 효율성, 자료구조 문제입니다. 문제 설명 PriorityQueue에 대한 이해가 있으면 쉽게 풀 수 있는 문제입니다. (모르면 효율성 통과 못할겁니다..) PriorityQueue는 Windows OS의 스케쥴러에도 사용됩니다. Python에는 heap이 있습니다. 아래는 우선순위큐에 대해 자세히 설명되어있는 블로그입니다. https://medium.com/@dor..

    [Spring Boot] - 유효성 검증을 하는 방법과 유효성 검증 실패 시 Exception핸들링을 하는 4가지 방법을 알아보자

    스프링에서 유효성 검증을 하는 여러가지 방법을 알아보겠습니다. BindingResult를 사용하는 방법 새 어노테이션을 만들고 ConstraintValidator를 상속받아 유효성 검증 필요한 어노테이션을 커스텀하기 Exception으로 처리하기 ControllerAdvice 사용하기 Validation은 프로그래밍에 있어 가장 필요한 부분입니다. 예를 들면 이름이 NULL인경우 NPE를 방지하거나 나이를 입력할 자리에 음수가 들어온 경우를 방지하는 과정을 Validation이라고 합니다. public void valid(String username, String password, int age) { if (username == null | password == null) { return; } if (a..

    [Spring Boot, RIOT API] - Unirest로 RIOT API를 요청하고 ObjectMapper를 배워보자.

    https://www.op.gg/ 롤 전적 검색 OP.GG - 전적 검색, 관전, 리플레이, 챔피언 공략, 카운터, 랭킹 롤 전적, 모든 게임의 전적, 챔프 평점, KDA, 승률을 볼 수 있고 리플을 보거나 자신의 게임을 녹화를 할 수 있습니다. 지금 바로 당신의 소환사명을 검색해보세요! www.op.gg OP.GG의 기능 중 전적검색과 랭커조회를 구현해보려고 합니다. 리팩토링된 서비스 코드는 맨 아래를 참고해주세요. 소환사 아이콘은 주소 참조방식을 사용했습니다. 리액트 코드와 전체코드는 맨 아래에 깃허브 주소를 참고해주세요. 감사합니다 :) 오랜만에 리액트를 복습할 겸 프로젝트를 시작했다. 1차 목표는 내 소환사 명을 검색하면 나의 정보를 불러오고, 현 랭커들의 정보도 불러온다. 현재 랭커들의 아이콘을..

    [알고리즘] 에라토스테네스의 체

    소수 판별 알고리즘의 종류 1. 2 ~ N -1까지 순회하면서 나누어 떨어지는 수가 있는지 확인하는 방법. 2. N의 약수는 (N/2-1)보다 클 수 없으므로 2 ~ N / 2 - 1까지 순회하는 방법. 3. N의 제곱근까지의 약수의 개수 * 2로 순회하는 방법 N = 12일 때 sqrt(N) = 3.46입니다. 12의 약수는 2 * 6 3 * 4 4 * 3 6 * 2 가 있는데, 12의 제곱근인 3.46를 기준으로 x * y | y * x로 숫자만 바뀌는 특성을 이용합니다. 1번 방법의 시간 복잡도는 O(N)입니다. 2번 밥법의 시간 복잡도는 O(N) T(N) N/2입니다. 3번 방법의 시간 복잡도는 O(sqrt(N)) 입니다. "에라토스테네스의 체" 알고리즘은 소수를 판별하는 가장 유명한 알고리즘 중..

    Least Recently Used 자료구조 구현 Java

    FIFO LIFO LRU LFU NUR SCR 대표적인 메모리 관리 방식 중 하나인 LRU를 구현해보자. 문제 설명 Main public static void main(String[] args) { Scanner sc = new Scanner(System.in); int n = sc.nextInt(); int m = sc.nextInt(); int[] work = new int[m]; for (int i = 0; i < m; i++) work[i] = sc.nextInt(); new Main().solution(n, work); } I / O 메인 메서드에서 Cache의 크기 N인 메모리에 수행하는 작업의 개수 M이 주어집니다. M개의 Integer 작업이 주어집니다. 모든 작업이 수행되고 메모리 공간에..

    [자료구조] 트리(Tree)

    트리 ( Tree ) 트리는 계층적인 구조를 표한할 때 유용하게 사용할 수 있는 자료구조입니다. [ 트리 관련 용어 설명 ] 루트 노드 (root node) 부모가 없는 최상위 노드입니다. 단말 노드 (leaf node) 자식이 없는 노드를 말합니다. 크기 (size) 트리에 포함된 모든 노드의 개수입니다. 깊이 (depth) 루트노드부터의 거리를 말합니다. 높이 (height) 깊이 중 최댓값을 의미합니다. 차수 (degree) 자식 방향의 간선갯수를 의미합니다. 이진 탐색 트리 ( Binary Search Tree ) 이진 탐색이 동작할 수 있도록 고안된 효율적인 탐색이 가능한 자료구조입니다. 이진 탐색 트리의 탐색 37은 30보다 크기 때문에 오른쪽 간선을 탑니다. 37은 48보다 작기 때문에 왼쪽..