전체 글

전체 글

    [Go] context 호출 계층에 따른 결과 테스트하기

    호출 순서(func) : main -> a -> ab -> abc -> abd -> ac -> b 취소 호출(func, time) : main(time.Second * 5) 영향 func : a,b,ab,ac,abc,abd 내용 보강 필요 실행 코드 package main import ( "context" "fmt" "sync" "time" ) func main() { ctx := context.Background() ctx, cancel := context.WithTimeout(ctx, time.Second*5) defer cancel() var wg sync.WaitGroup wg.Add(2) go a(ctx, &wg) go b(ctx, &wg) wg.Wait() } func a(ctx contex..

    [Go] Go를이용한 Stack 구현

    [Go] Go를이용한 Stack 구현

    이번에 GoLang을 배우면서 문법 공부 복습 및 GoLang에서의 Stack은 어떻게 구현될까 궁금해 직접 구현해봤다. package main import ( "errors" "fmt" "log" ) type stack struct { top *node } type node struct { val int next *node } func newStack() *stack { return &stack{ top: nil, } } //LIFO Last In First Out func (s *stack) push(val int) { if s.top == nil { n := &node{val: val, next: nil} s.top = n return } n := &node{val: val, next: s.top}..

    [회고] 하나의 조직에서 떠날때의 기분은 표현이 불가능하다

    [회고] 하나의 조직에서 떠날때의 기분은 표현이 불가능하다

    오늘의 글은 조금 재미없지만 이 기분을 기록하기 위해 쓰는 회고록이다. 나는 지난 4개월 동안 중고나라 인턴십을 진행하면서 많은 개발을 참여하였고 다양한 상황에 대한 경험을 했다. 처음 입사했을 당시에는 모든게 낯설었다. 지금껏 다뤄보지 못한 기술들을 사용하고 있었고 대학 생활때 했던 프로젝트는 비교도 안될만큼 모든게 고도화 되어있었다. 다행히 당황은 오래가지 않았고 해당 부서에서 어떤것을 개발하고 있고, 현재 진행중인 프로젝트는 무엇이고, 인프라는 어떻게 이루어 졌는지 모든걸 파악하는데에 온전히 집중했다. 그렇게 시간이 지나고 내게 큰 프로젝트들이 맡겨졌다. 보통은 긴장하기 마련인데 나는 오히려 설레고 얼른 경험 해 보고 싶었다. 물론 원만한게 진행되는것은 아니였다. 해당 프로젝트를 진행함에 있어 예상..

    [Java] 자바에서의 동기화는 왜 어렵고 까다로울까?

    "멀티쓰레드 개발은 언어 무관하게 무지 어렵다. 세계 최고 개발자의 할아버지가 와도 어렵다." 언어를 배운다는것은 정말 힘든일이라고 생각되는게, 지금 쓰고있는 "자바에서의 동기화는 왜 어렵고 까다로울까?" 를 읽어보면 아시겠지만, 해당 언어에 대한 경험이 많지 않다면 실수하기 쉬운 문제가 도처에 도사리고 있습니다. 그 이슈를 실전에서 대처하려면 ,실수에 의한 경험도 필요하고, 가끔은 소스의 내부를 철저히 조사해봐야하는 수고를 해야하는데, 언어를 배우는것도 힘든데 저런부분까지 신경쓰려면 고난의 행군은 각오해야할거 같습니다. 1. Collections.synchronizedList 이야기 보통 우리는 Vector 대신해서 ArrayList 를 사용하라는 말을 듣곤합니다. Vector 는 동기화되어진 함수로..

    [HTTP] gRPC에 대해 알아보자 - 개요 (1)

    [HTTP] gRPC에 대해 알아보자 - 개요 (1)

    1. 서론 최근 MSA가 각광받으면서 많은 회사에서 Monolithic 구조를 여러개의 마이크로 서비스로 분리하려고 시도하고 있습니다. MSA 구성은 다양한 장점을 내포하고 있으나 그만큼 다양한 문제점 또한 상존합니다. 이 글에서는 MSA의 문제점 중 하나인 네트워크 통신 overhead에 초점을 맞추어 gRPC 기술이 어떤 부분을 해소해줄 수 있는지에 대해서 다루어보고 해당 기술은 어떻게 사용할 수 있는지에 대해서 설명해보고자 합니다. 2. 마이크로 서비스간 통신 이슈 Monolithic 구조에서는 하나의 프로그램으로 동작하기 때문에 그 안에서 구조적인 2개의 서비스간의 데이터는 공유 메모리를 통해서 주고받을 수 있습니다. 따라서 이 경우 서비스간 메시지 전송 성능은 큰 이슈가 되지 않습니다. 반면 M..

    [MySQL] 쿼리 최적화 및 튜닝 기술

    Query Optimize Skill(Query 최적화 및 튜닝 기술) [ Tip #1: Use Column Names Instead of * in a SELECT Statement ] 테이블에서 몇 개의 컬럼만을 조회하는 경우라면, SELECT *을 사용할 필요가 없다. 비록 이것이 적기 편할 수 있지만, 쿼리를 완료하기 위해서 더 많은 시간을 필요로 한다. 필요한 일부 컬럼만을 선택함으로써 결과 테이블의 크기를 줄이고 네트워크 트래픽을 감소시킴으로써 쿼리의 평균 속도를 높일 수 있다. Original: SELECT * FROM SH.Sales; Improved: SELECT s.PROD_ID FROM SH.Sales s; 27% Time Reduction [ Tip #2: Avoid including..

    [Spring] Spring WebClient의 사용

    [Spring] Spring WebClient의 사용

    Spring 어플리케이션에서 HTTP 요청을 할 땐 주로 RestTemplate 을 사용했었습니다. 하지만 Spring 5.0 버전부터는 RestTemplate 은 유지 모드로 변경되고 향후 deprecated 될 예정입니다. RestTemplate 의 대안으로 Spring 에서는 WebClient 사용을 강력히 권고하고 있으며 다음과 같은 특징을 가지고 있습니다. Non-blocking I/O Reactive Streams back pressure High concurrency with fewer hardware resources Functional-style, fluent API that takes advantage of Java 8 lambdas Synchronous and asynchronous ..

    [백준 알고리즘] 14889번 스타트와 링크 (JAVA)

    [백준 알고리즘] 14889번 스타트와 링크 (JAVA)

    주의 사항 해당 문제는 두가지 유형으로 풀이가 가능하다. DP 완전 탐색 : n은 11보다 작기에 시간복잡도는 O(n!) = O(10!) = 3,628,800 (대략 40만) < 100,000,000 (1초) 이다. 코드 블럭 DP (다이나믹 프로그래밍) package boj400; import java.util.ArrayList; import java.util.Scanner; public class boj_9095 { public static void main(String[] args) { Scanner scanner = new Scanner(System.in); int n = scanner.nextInt(); ArrayList list = new ArrayList(); for (int i = 0; i..