-
feature 개발 진행하면서 알게된 것들 책, 영상, 자료를 먼저 보고 파악한 내용이 아닌 실제 필요한 기능 개발을 하면서 알게된 것들 : 정말 소중한 경험을 하면서 얻게된 것들을 당분간 남길 것 같음 Jackson json 파싱 기준(예제) 자바빈 규약을 지켜야함 : NoArgsConstructor, setter/getter [] 일 경우 array로 할지, List로 할지는 마음대로 하면 됨 { "id": 123, "name": "Pankaj", "permanent": true, "address": { "street": "Albany Dr", "city": "San Jose", "zipcode": 95129 }, "phoneNumbers": [ 123456, 987654 ], "role":...
-
MySQL 데이터 타입 성능을 위해서 꼭 맞는 데이터를 고르기 : 공간 낭비(읽어오는 시간, 공간까지도 낭비) 숫자 unsigned : 양수(+)만 타입 크기 참고 BIT(N) 1 ~ 64bit까지 지정 크게 잡고 작은 수를 넣을 경우 0으로 채워짐 TINYINT 1byte SMALLINT 2byte INT 4byte BIGINT 8byte FLOAT 4byte DOUBLE 8byte DECIMAL 지정 시 : (M, N), Mbyte(정확한 소수점을 저장할 때 사용) M 길이로 N개 남은 수부터는 소수점으로, 문자 타입 크기 참고 CHAR(N)...
-
test spock 사용해보기 기존에 자바 코드(+spring)를 테스트할 때는 JUnit(unit test), Mockito(integration test)을 사용해서 테스트를 했는데, 워크샵에서 groovy로 테스트 코드를 작성하는 것을 보고 무엇인지 보았더니 Spock 였음 /* build.gradle Spock 추가 : mvnrepo(Core Module) : 스프링 환경에서 테스트 하는 것이 아니므로 Core만 */ dependencies { testCompile group: 'org.spockframework', name: 'spock-core', version: '1.1-groovy-2.4' } junit과 비교했을 때 Spock는 어떤 특징을 가지는지 알아보았음 POJO 테스트 /* 테스트 대상 코드 */ public class Person { private static NameRule rule...
-
java 병렬로 연산하기 ExecutorService API 쓰레드풀에 일정 개수의 쓰레드를 만들어두고 처리하는 방식의 API : limit 개수만큼 동시에 처리함 ExecutorService executor = Executors.newFixedThreadPool(5); List<Future<String>> results = new ArrayList<>(); for (int i = 0; i < 30; i++) { results.add(executor.submit() -> { Thread.sleep(5000); return Thread.getCurrrentName() + ", end time : " + LocalDateTime.now(); }); } for (Future<String> result : results) { System.out.println(result.get()); } executor.shutdown(); Stream API(java8) 하나의 task를 여러개 task로 쪼개고, 처리한 후 하나로 합치는 형태로 처리...
-
오늘의 회고 드디어 시스템 파악하기 시작! 모르는 것은 모른다고 말하고 배우는 자세를 취하면 아무리 실력 없더라도 안좋게 보지는 않을까 생각함. 그리고 입사해서 느낀 것은 글로 정리하는건 역시나 중요하다는 것 사내 위키에 시스템에 대한 히스토리 정리, 설명이 잘 되어 있다보니 파악하기가 수월하였음 명패에 쓴 “기본으로 돌아가자” 문구처럼 모르겠으면 거기서 헤매기보다 처음부터 훑어보면서 어디를 모르는지 체크부터 하도록 해야겠다. 오늘 공부 못한만큼 내일 많이 해야지~~~ 데이터베이스 upsert 데이터베이스에 저장되어있는 데이터가 있을 경우(unique key값 기준) update, 없을 경우 insert...
-
데이터베이스 트랜잭션 격리 수준(Lock 정책) 멀티쓰레드 환경에서 트랜잭션이 지켜야하는 트랜잭션 간의 간섭 금지(Isolation)와 속도 트레이드오프 발생 : 격리 수준 특징을 알아야 도메인 특징에 따라 알맞는 격리 수준을 골라 트레이드오프 상황을 벗어날 수 있을 것이라 생각됨 데이터베이스마다 다르기 때문에 어떤 격리 수준이 있는지는 알아봐야함 명칭 설명 발생할 수 있는 문제점 read uncommited 커밋되지 않은 데이터 변경까지도 다른 트랜잭션에서 읽기 가능 phantom read, non-repeatable read, dirty read read commited 커밋된 데이터 변경을 읽을 수 있음 phantom read,...
-
REST 도대체 REST가 무엇인가? 이전까지는 그냥 아키텍쳐 스타일, API를 디자인할 때 지켜야하는 원칙들의 모음이라고만 얼핏 알고 있었음 그러니 누가 설명해달라고 했을 때 선뜻 이게 무엇이다라는 말을 하지 못하겠음 그 말은 즉슨 내가 잘 모른다는 사실 그래서 REST에 대해서 나름의 정의를 머리에 가지기 위해 여러 글들을 찾아보게 됨 REST 원칙들이 무엇인지는 알아도, REST가 왜 고안되었는지는 알아도 정작 REST의 REpresentational State Transfer에 대해 관심을 가져보지 않음 REST 알아보기 특정 리소스의 상태 정보를 전달하는 것을 말함 : HTTP...
-
스테이트 패턴 객체의 상태가 변경됨에 따라 다르게 행동할 수 있음 : 상태 자체를 객체화하는 것이라고 이해됨 - 상태를 추상화 시킴, 상태에 따라 할 수 있는 일이 많아지고 조건문이 엄청 세분화 되어질 때 분리시켜서 관리하도록 하는 것이 좋을 듯 상태 별로 같은 행동(코드 중복 제거), 상태 별로 코드 관리(코드 관리에 편함) 볼링 게임 구현할 때 사용했던 패턴이었음 : 상태 자체가 실질적으로 쓰러뜨린 핀(입력된 값)이 유효한 값인지 아닌지 해당 프레임의 상태값이 무엇인지 정할 수 있었음 예제로 되새겨보는...
-
Java API ArrayList vs LinkedList 많이 쓰는 자료구조지만, 개념적으로 차이도 이해하고 있지만 익숙하다고해서 ArrayList만 사용하지않나? 제대로 사용하기위해서 코드를 눈으로 봐야겠다싶었음 개념적 차이 ArrayList는 배열로, LinkedList는 객체 간 연결을 통해 리스트를 만듦 ArrayList는 탐색에 유리 : 인덱스 LinkedList는 제일 앞, 뒤 확장에 유리 : 삽입이 빈번할 때 유리 API 코드 확인 LinkedList /* head와 tail을 알고 있음 */ transient Node<E> first; transient Node<E> last; /* 꼬리에 붙임 */ public boolean add(E e) { linkLast(e); return true;...
-
JPA ORM으로 테이블 복잡도 줄이기 성능 상의 이점을 보기 위해서 두 테이블로 나누지않고 하나의 테이블에 관련 정보를 모음 : JOIN 하지않고 그냥 SELECT 하기위해서 @Embedded와 @Embeddable로 복잡도 줄이기 : 객체 분리해서 모듈 형태로 관리하기 - 하나의 큰 판(CarInfo)과 여러 모듈(Car, Owner) 테이블 mysql> desc carinfo; +-------+-------------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +-------+-------------+------+-----+---------+-------+ | id | int(11) | NO | PRI | NULL | | | name |...
-
도커 리눅스 컨테이너 기술을 활용함 : 사용 하는 것에 있어서 추상화 시킨 것으로 이해함 - 사용할 때 커맨드 인터페이스로 명령(docker run, images 등) 왜 경량화인가? 왜 고립되었다고 하는가? (단번에 이해하기 어려운 기술일 것 같아서 계속해서 봐야할 듯) 가상화랑은 다르게 호스트 OS에 게스트 OS를 설치하지않음 : 호스트 커널을 공유함 자원을 같이 쓰되 고립된 환경에서 사용함 개발, 배포, 운영 단계에 반복적으로 해야할 수 있는 일을 이미지화 시켜서 생산성을 향상 시킴 개발 환경을 세팅한다면 jdk 설치, 빌드툴 설치,...
-
트랜잭션과 스프링 트랜잭션 격리성을 보장하면서도 성능을 가져가야함 동시에 실행되는 트랜잭션은 서로 영향을 미치면 안됨(상황에 따라 어느 수준까지 영향을 미치지 않을 것인가 정해야함 - Lock 정책) - 예를 들어 T1이 SELECT한 데이터를 T2가 UPDATE를 했을 때 T1이 다시 SELECT 하면 다른 값이 읽히는 그런 영향(Repeatable Read 불가 - 각 락 정책에 따라 발생할 수 있는 문제가 있음) 데이터 정합성 수준에 따라 Lock 정책을 정하면 됨 : 기본적으로 데이터베이스마다 설정되어있는 정책이 있음 mysql> show variables like 'tx_isolation';...
-
정리해보기 객체지향 객체지향 : 분업화, 하나의 세상을 이루기위해서 하나의 존재만이 있는 것이 아니라 여러 존재들이 협업하면서 세상을 이룸, 협업이 필요하다면 필요한 객체가 다른 객체에 메세지를 보내 요청함, 파일로 코드를 분리한 것과는 전혀 다른 개념임(저장 공간만 달리할 뿐 하나로 처리하는건 마찬가지) 객체지향의 장점 : 역할 별로 객체를 나누다보니 어떤 한 기능을 수정할 때 담당 객체의 코드만 수정해주면 됨 - 변경점이 하나로 모임, 변경사항이 생기더라도 유연하게 대처할 수 있음(코드 간의 의존성이 적기때문에 - 물론 객체지향적인 프로그래밍을 했다면),...
-
Stream API 하나씩 사용해보기 flatMap map과 flatMap 차이 : map은 1:1로 변환하는 함수라면, flatMap은 N:1 변환하는 함수(배열 -> 스트림으로 변환할 때 사용) stream에 진행 함수에 들어가는 값(input)이 배열인 것을 하나하나 떼어놓을 때 Stream.of( new String[]{"a", "b", "c", "d", "e"}, new String[]{"f", "g", "h", "i", "j"} ) .flatMap(Arrays::stream) .map(str -> str.charAt(0)) .filter(ch -> ch > 'a') .collect(toList()) .forEach(ch -> System.out.print(ch + " ")); sorted 감싸져있는 콜렉션 원소들을 정렬함 primitive type의 경우 대소 관계를 비교(정수)할 수 있음,...
-
Stream API Stream API : 콜렉션에 저장된 요소(데이터)에 대해 어떤 처리를 하기위해 만들어진 API forEach로 하면 안되나? 코드 간결해지면서도 Lazy한 처리가 가능(최종 결과내는 메소드를 사용하지않으면 그때까지 처리를 하지않음), *기존 콜렉션에 대해서는 조작하지않으면서도 원하는 결과값을 얻어낼 수 있음, 병렬처리를 쉽게할 수 있음(API에 있음) 데이터 변경보다는 데이터 처리가 주목적 IntSummaryStatistics 최댓값, 최솟값, 평균 등 기본적으로 필요한 값에 대해 매번 구하려고 Stream API 쓰는게 아니라 하나의 객체만 리턴하도록 하면 됨 어떤 값에 대해 최대, 최소, 평균 등을 구할...
-
java-ims ControllerAdvice, RestControllerAdvice @RestController와 @Controller의 차이 : 응답 데이터가 json이냐 뷰(.html)냐 차이 @RestControllerAdvice : response를 json으로 변환해주는 역할, rest api 구현할 때 사용 컨트롤러의 타입에 따른 예외처리 분기 같은 타입의 예외지만 각기 다른 처리를 할 수 있음 : json 응답, redirect 혹은 특정 view 응답 /* RestController */ @RestControllerAdvice(annotations = RestController.class) @Order(1) public class SecurityRestControllerAdvice { ... } /* Controller */ @ControllerAdvice(annotations = Controller.class) @Order(2) public class SecurityControllerAdvice { ... } ResponseEntity static 메소드 ResponseEntity의...
-
JPA DDL : 테이블 생성, 변경 등의 쿼리, 테스트 서버에서는 자동 변경하도록 설정하는 것이 괜찮지만 실서버에서는 그러면 안됨 스키마 : 데이터베이스 테이블 정보를 집약해서 하나 만들어두고, 레퍼런스 삼아서 JPA(정확히는 구현체) 작업을 함 키(pk) 생성할 때 : 대리키를 사용하라 키 생성 전략(자동 - 대리키) : 엔티티에 키를 할당하는 전략, 데이터베이스 마다 각각 다른 전략을 취하고 있음 IDENTITY : 키 생성부터 할당까지 데이터베이스에서 함, auto_increment 전략을 사용하려면 해당 전략을 사용해야함 SEQUENCE : 키 생성은 데이터베이스 시퀀스(키 생성...
-
테스트 코드 중복 없애기 테스트 코드 중복을 없애기 위해서 2가지 방법(+@)이 있음 @Before 메소드를 사용 : 모든 테스트메소드가 거치기때문에 필요없는 메소드도 호출하는 단점이 있음 일반 메소드(prehandle 개념 메소드)를 정의해두고 prehandle을 거쳐야하는 @Test에서 호출하는 방법 : 코드양은 늘어나지만 필요한 메소드에만 적용시킬 수 있음 +@ 방법은 2번째에서 상속을 사용해서 중복을 제거하는 것 테스트 코드 또한 중복을 제거하지않으면 테스트 케이스가 늘어날수록 중복 제거한 코드보다 코드양이 훨씬 더 늘어남 2번째 방법으로 중복 제거하기 public class QnaAcceptanceTest extends AcceptanceTest {...