분류 전체보기
2019 네이버 인턴 -> 정규직 전환 면접(1차, 2차) 후기
2019 네이버 인턴 -> 정규직 전환 면접(1차, 2차) 후기
2019.09.19이 글은 보호되어 있기 때문에 이것을 보려면 암호가 필요합니다.
Website for public datasets
Website for public datasets
2019.09.10Recommendation datasets: http://cseweb.ucsd.edu/~jmcauley/datasets.html https://www.wikidata.org/wiki/Wikidata:Database_download/ko Machine learning datasets (including clustering): https://archive.ics.uci.edu/ml/index.php Various datasets: https://www.kaggle.com/datasets Network(graph) datasets: https://snap.stanford.edu/data/ Graph datasets: https://graphchallenge.mit.edu/data-sets Web graphs:..
if kakao 2019 day1 참석 후기
if kakao 2019 day1 참석 후기
2019.08.29Keynote 키워드는 Growth 기억에 남는 문구는? 개발자는 곧 첫번째 고객. 개발자의 의견이 프로덕트에 적극적으로 반영되어야한다. 오픈소스 DB 흐르는 데이터를, 실시간 데이터 변경 재배치하는게 목표. 왜 필요한가? shard에도 한계가 있어서? Overwrite & Sequential & Parallel 데이터 분산 재배치 방안 2가지? 1. SQL로 데이터 퍼가기 2. Change Data Capture로 변경분 퍼가기 SQL로 데이터 퍼가기? 상대적으로 구조가 간결하지만 소스에 DB에 부하.(SELECT, INDEX) 지연된 커밋에 따라 데이터 누락 발생 가능. CDC로 변경분 퍼가기 소스 DB에 SELECT등이 발생하지 않기 때문에 부하가 거의 없음. 비동기 데이터 복제 및 복제 시스템 운..
HTTP에 대해서
HTTP에 대해서
2019.08.29HTTP/1.1 HTTP/1.0 과 HTTP/1.1의 차이 몇 가지 차이점이 있지만 가장 큰 차이점은 socket connection 재사용 옵션 부분이다. HTTP/1.0 : Connectionless `` Connection: close``가 default HTTP/1.1 : Connection 유지 `` Connection: keep-alive``가 default HTTP 패킷의 시작과 끝 기본적으로 `` Content-Length`` 헤더를 보고 인식한다. Content-Length가 없으면, connection이 끊어질 때 까지 계속 읽는다. 그렇다면 항상 전체 패킷에 대한 Content-Length를 미리 계산해야 할까? => chunked encoding을 사용하면 아래와 같이 길이를 모르는..
[DB] 분산 DB, 파티셔닝 (partitioning ), 샤딩 (sharding)
[DB] 분산 DB, 파티셔닝 (partitioning ), 샤딩 (sharding)
2019.08.25파티셔닝(단편화) 란? 저장해야 하는 정보가 많은 대규모 시스템의 경우 하나의 DB에 모든 정보를 저장해서는 제대로 된 응답성을 기대할 수 없다. read가 많이 발생하든, write가 많이 발생하든 DB 저장하는 정보가 많을 수록 스캔 속도도 느려지고, 요청이 많은 경우 큐에 작업이 쌓이면서 응답도 느려진다. 그래서 DB를 여러대 운용해서 응답을 좀 분산해보자, 라는 생각을 하게 되는데, 가장 쉽게 생각해 볼만한건 Master DB의 데이터를 복제한 Slave DB를 두고, read를 분산하는 것이다. 스캔 속도는 그대로겠지만 요청을 분산할 수 있다. 그러나 이 방법은 write는 분산되지 않는다. Master에 write가 발생하면 이를 Slave에 복제 해줘야 하므로, 복제하면서 같은 내용의 wri..
공통 비즈니스 로직 분리(제휴사 인터페이스 통합 및 클래스 설계)
공통 비즈니스 로직 분리(제휴사 인터페이스 통합 및 클래스 설계)
2019.08.21- 제휴사 API 서버 Npay 서버 연결 작업을 각자 진행한 후, 이를 하나로 통합하는 과정에서 비즈니스 로직 코드 중복이 발생함. - 코드 중복을 해결하면서 제휴사 마다 다른 구현 사항을 고려하여 처음 설계한 아키텍쳐는, PointChangeService라는 abstract class에 공통 로직을 작성하고, 각 제휴사 마다 다른 부분은 abstract 메서드로 만들어 상속을 이용해 구현을 강제하는 방법이었음. - 그러나 서비스가 점차 커지고 코드가 복잡해지면서 순환 의존 (Cycle Dependency) 문제가 발생함. - 더불어 PointChangeService의 책임이 너무 많다는 문제점도 있었음. 결국 XXPointChangeService는 제휴사 마다 다른 구현부와 공통 비즈니스 로직을 모두..
[Chrome] request pending 기능
[Chrome] request pending 기능
2019.08.08상황은 이렇다. 전환 진행 중인 유저가 중복으로 전환을 요청하면 튕겨내주도록 코딩했고, 사파리나 IE 등에서는 실제로 중복 요청을 잘 막아 주었다. 그런데 크롬에서는 브라우저 2개 띄워놓고 각각 1번 씩 "전환" 버튼을 눌러 요청(a, b)하면, a 요청에 대한 응답이 돌아오고 나서 b 요청도 정상적으로 처리가 되는 것이었다. 내가 예상한 대로라면 b 요청은 요청하는 즉시 응답이 돌아오며 "중복 요청"이 떠야 했다. 사파리에서 브라우저 2개 띄워놓고 동일 조건으로 테스트했다. 사파리는 내 예상 시퀀스 대로, b 요청을 요청하는 즉시 "중복 요청"이 돌아오고, 뒤이어 a 요청에 대한 응답이 돌아왔다. 크롬 브라우저 2개에서 각각 1번 씩 누르는 것은 위처럼 예상치 못하게 동작했으나, 크롬 브라우저 1개에서..
Spring AOP / @annotation resolve
Spring AOP / @annotation resolve
2019.07.30AOP(Aspect Oriented Programming)는 언제 유용한가? 가끔 AOP를 쓰지 말아야 할 곳에 AOP를 쓰는 경우를 보게 된다. 어떤 기능은, 쓸 수 있다고 쓰는게 아니라, 쓰는게 효용이 있을 때 확실한 근거를 가지고 올바르게 써야한다. AOP를 쓰기 전에 이런 물음을 던져보아야 한다. '어떤 기능이 현재 클래스의 관심 밖이라면, 별도 클래스로 분리해서 호출하면 되는 것 아닌가?' class A(otherClass: Cls) { fun method(p: Param) { otherClass.doSomething(p) ... } } 맞다. 위와 같이 짤 수 있고, 어색하지 않다면 이런 코드를 굳이 AOP로 바꾸는게 별다른 이점은 없다. 하지만 AOP가 분명히 유리한 경우가 있다. 아래는 그..
Hystrix with Spring ( Circuit Breaker ) 를 사용할 때 주의해야 할 점.
Hystrix with Spring ( Circuit Breaker ) 를 사용할 때 주의해야 할 점.
2019.07.30기본 Hystrix 라이브러리는 직접 HystrixCommand를 상속받아 정의해서 써야 하므로 약간 번거롭다.Spring을 쓰고 있다면 @HystrixCommand 애너테이션으로 이런 번거로운 설정을 대신하는 라이브러리를 도입할 수 있다.아래 dependency를 추가하도록 하자. ```xml org.springframework.cloud spring-cloud-starter-netflix-hystrix 2.1.2.RELEASE````` spring-cloud-starter-hystrix``는 deprecated 되었기 때문에 `` spring-cloud-starter-netflix-hystrix``를 사용해야 한다는 점과, SpringBoot 2.x 대를 사용하고 있다면 hystrix 버전도 2.x...
[Spring] context.getBean() 사용하기
[Spring] context.getBean() 사용하기
2019.07.29Service 구현체가 많은 경우, 각각을 다 DI 하면 확장성이 떨어져 이를 Map에 담고 Interface로 꺼내 호출하는 방식을 자주 사용하게 된다. 다음과 같은 방법을 사용하면 Service Bean을 직접 불러올 수 있어 굳이 Map에 담지 않아도 사용 가능하다. 새로운 Service가 추가될 때 컨트롤러 쪽을 전혀 수정하지 않아도 되는 방식. (Map에 담는 방식은 생성자에서 map.put 해서 담아주어야 하니까...) ```java private final ApplicationContext context; // + DI ``` ```java PointChangeService pointChangeService = context.getBean(partnerCode + "PointChangeSer..
[Transaction] lost update problem (isolation level, deadlock, update lock)
[Transaction] lost update problem (isolation level, deadlock, update lock)
2019.07.23포인트 읽기 - 포인트 차감 순으로 DB 작업이 발생하는 상황이었다. ```java @Transactional public foo bar() { // SELECT MemberRestMileageInfo member = getMemberMileageByKey(memberKey); ... // UPDATE memberInfoMapper.update(member); } ``` 이런 상황에서 같은 `` memberKey`` 를 대상으로 빠르게 두 번 요청하면 갱신 손실 문제가 발생한다. ``` T1 T2 start transaction start transaction SELECT SELECT UPDATE UPDATE ``` 즉, 먼저 들어온 트랜잭션이 UPDATE 하기 전에 다른 트랜잭션이 SELECT를 해버리..
[Spring] DB 관련 : H2 설정
[Spring] DB 관련 : H2 설정
2019.07.23build.gradle에 다음을 추가. ``` runtimeOnly 'com.h2database:h2' // runtimeOnly 'com.h2database:h2:1.4.193' ``` 반드시 버전을 명시해줄 것. 버전 명시하지 않을 시 최신 버전이 설치되는데, 콘솔에서 connect해보면 자동으로 db 파일을 생성할 수 없어서 에러가 발생한다. :mem:을 써서 인메모리에 하든, :file:을 써서 파일로 저장하든 관계없이 에러가 발생함. 이는 어떤 취약점 때문에 자동으로 파일 생성하는걸 막아둬서 그렇다고 함. IFEXISTS 플래그를 주면 된다고 나와있는데 줘도 안됨. Database "mem:testdb" not found, and IFEXISTS=true, so we cant auto-creat..