제네릭은 왜 사용할까? 제네릭은 JDK1.5부터 새롭게 등장했다. 그러면 제네릭이 도입되면서 어떤것이 바뀌었는지 고민해보자. 제네릭을 사용하면 타입 안정성이 증가하고, 타입체크와 형 변환을 생략할 수 있어서 코드가 간결해 진다고 한다. 과연 사실일까? 제네릭을 사용하는 대표적인 클래스로는 List가 있다. List list = new ArrayList(); 이 리스트는 어떠한 값이든 저장할 수 있다. List list = new ArrayList(); list.add(2); list.add("Hello"); list.add(100L); list.add(1.5); int, string, long, double다양한 타입이 들어왔다. 이것을 출력해보자. for (Object object : list) { S..
내가 이 책을 리뷰한다고 했을때, 막막했다. 왜냐하면 나는 자바 개발자이며, 이제 막 회사에 입사한 사회 초년생이기 때문이다. 나는 이 책이 단순한 파이썬 책인줄만 알았다. 근데 아니였다. 이 책은 기본서가 아니다. 그래서 파이썬으로 뭔가를 코딩해볼려고 하는 사람들에게는 추천하고 싶지 않다. 왜냐하면 이 책은 단순히 코딩이라는 단어로 포장할 수 있는 그런 책이 아니다. 그것보다 훨씬 심오하고 어렵다. 그렇다면 이 책은 어떤 사람들이 읽어야 할까? 책 제목에서 알 수 있다싶이 진지하게 파이썬을 학습할 생각이 있는 사람들에게 추천한다. 그러니까 가볍게 파이썬을 학습할 생각을 가진 사람은 이 책을 읽지 않는것이 정신 건강에 좋을거라 생각한다. 파이썬은 인기 프로그래밍 언어중 하나이다. 사실 파이썬이 각광받기 ..
자 드디어 rest-docs를 적용할때가 왔다. Spring REST Docs Document RESTful services by combining hand-written documentation with auto-generated snippets produced with Spring MVC Test. docs.spring.io 원래 private MockMvc mockMvc; @Autowired private WebApplicationContext context; @Before public void setUp() { this.mockMvc = MockMvcBuilders.webAppContextSetup(this.context) .apply(documentationConfiguration(this.re..
나머지 연산 3 % 2 = 1 말한다. 위 식은 다음과 같다. ((2%2) + (1%2) %2 ) => (0 + 1) % 2 => 1 곱하기도 가능하다. ((3%2) * (1%2) %2 ) => (1 * 1) % 2 => 1 하지만 아쉽게도 나눗셈은 되지 않는다. 사실 나머지 연산을 중심으로 하는 문제는 거의 없다. 다만 이것은 주로 숫자가 너무 커서 나눠야 되는 상황에 유용하다고 한다. 대표적인 문제 www.acmicpc.net/problem/4375 4375번: 1 2와 5로 나누어 떨어지지 않는 정수 n(1 ≤ n ≤ 10000)가 주어졌을 때, 1로만 이루어진 n의 배수를 찾는 프로그램을 작성하시오. www.acmicpc.net - 1로만 이뤄졌다는 뜻은 1, 11,111,1111을 말한다. 약수..
HATEOAS란 무엇일까? Hypermedia as the Engine of Application State의 약자로 요청에 대한 응답값에 사용자가 사이트를 네비게이션 할 수 있는 링크들을 만들어 포함시킬 수 있도록 해주는 라이브러리라고 한다. 이러한 기능을 스프링에서 제공하고 있다. 그래서 스프링 헤이티오스 그럼 헤이티오스는 어떤 것을 해줄까? 크게 2가지 부분으로 나눌 수 있다. 첫 번째는 링크를 만들 수 있는 기능을 제공한다. 링크 만드는 방법 : linkTo(DeliveryController.class).slash(newDelivery.getId()).toUri(); 링크를 만드는 방법은 이것말고도 많은데, 대표적으로 linkTo로 만드는 방법이 존재한다. lonkTo로 uri를 만들 수 있게 되..
만약에 검색 조건을 잘못 입력한 경우는 어떻게 될까? 최대한 간단하게 작성해봤다. 만약에, 주문 날짜가 배달 완료 날짜보다 늦은 경우라면 어떻게 해야할까? 솔직히 말이 되지 않는다. 이럴때는 어떻게 처리를 해야할까? @Test void badRequest() throws Exception { DeliveryDto delivery = DeliveryDto.builder() .item("book") .user("klom") .deliveryTime(LocalDateTime.now().plusDays(10)) .deliveryEndTime(LocalDateTime.now()) .itemPrice(0) .build(); mockMvc.perform(post("/api/delivery/") .accept(Medi..
프로세스와 쓰레드 프로세스 : 실행중인 프로그램 쓰레드 : 프로세스안에서 작업을 수행 jvm => 조그만 os 거대 os(맥, 위도우,리눅스)안에 실행하는 프로그램(java)에서 사용하는 os 어떻게 보면 jvm이 os라 생각해도 무방하다고 생각한다. 하얀것이 프로세스 , 파란것이 쓰레드 쓰레드들은 각자의 영역을 지키면서 프로세스의 일을 함께 처리. 멀티 테스킹 vs 멀티 쓰레딩 멀티 테스킹 : 여러 가지 프로그램을 동시에 실행 하는 것을 의미한다. 멀티 쓰레딩 : 하나의 프로그램을 수 많은 쓰레드로 실행하는 것을 의미한다. CPU의 코어 => 쓰레드의 갯수 멀티 쓰레딩의 장 단점 - cpu의 사용률을 향상 시킨다. - 자원을 효율적으로 사용할 수 있다. 쓰레드도 어떻게 보면 하나의 프로그램이라고 할 수..
I/O 입력과 출력을 뜻하는 용어로, 입출력은 컴퓨터 내부 또는 외부의 장치와 프로그램간의 데이터를 주고받는 것을 말한다. 스트림/버퍼/채널 스트림 스트림은 흐름이라는 뜻을 가지고 있다.(람다의 스트림과 의미는 같을지도 모르겠지만 전혀 다른 용어이다.) 간단히 말하면 입력에서 출력으로 흐르는 흐름을 뜻한다. 그냥 통로 입력이 출력으로 가는 통로라고 생각해도 될것 같다. 입력에서 출력으로 가기 때문에 단방향으로 데이터 전송이 된다. 왜냐하면 출력에서 입력으로 가는것은 말도 안 되기 때문이다. 만약에, 한 개가 아니라 여러개를 동시에 보낸다고 한다면 어떻게 될까? 이런식으로 큐 형식(FIFO)으로 진행이 된다는 것을 알 수 있다. 즉, 먼저 입력받은것이 가장먼저 입력되는 시스템인거죠. 버퍼 그렇다면 버퍼는 ..
API를 만들다보면, 입력값을 제한하고 싶은 경우가 발생합니다. 예를들면, public class Delivery { private int id; private String item; private String user; private LocalDateTime deliveryTime; private LocalDateTime deliveryEndTime; private DeliveryStatus status; private Integer itemPrice; private Integer deliveryCost; } 이런 객체가 있다고 가정해봅시다. 그런데, id같은 경우 jpa에서 번호를 정해주고, deliveryStatus는 현재 배달의 진행을 보고 결정 되고, deliveryCost는 itemPrice의..
c accept,content에 대해 무지했던것 같다. @Test void create_Delivery() throws Exception { Delivery delivery = Delivery.builder() .id(10) .item("book") .user("klom") .build(); mockMvc.perform(post("/api/delivery/") .accept(MediaTypes.HAL_JSON_VALUE) .contentType(MediaType.APPLICATION_JSON) .content(objectMapper.writeValueAsString(delivery)) ) .andDo(print()) .andExpect(status().isCreated()); } 코드를 이렇게 수정했다...
어노테이션 어노테이션은 주석이라는 뜻을 가지고 있다. 기본적으로 우리가 아는 주석은 // 또는/* */ 이렇게 생겼는데, 어노테이션과 일반적인 주석은 뭐가 다른걸까? - 어노테이션의 역할도 주석과 크게 다르지 않는다. - 일반주석과 큰 차이점은 코드를 작성할 수 있다는 것이 다르다. - 코드를 작성할 수 있다는 뜻은 어노테이션으로 뭔가를 할 수 있다는 뜻이 된다. - 어노테이션도 enum과 마찬가지로 1.5에 등장했다고 한다. 어노테이션을 정의하는 방법 public @interface Make { } 이렇게 정의하면 된다. enum은 java.lang.Enum에 상속되어있다고 학습하였다. 그러면 어노테이션의 조상님은 과연 뭘까? 바이트 코드를 통해 확인해보자. public abstract @interfa..
나는 배달API를 restAPI로 만들어 볼려고 한다. 내용은 스프링 기반 REST API 개발 에서 공부한 내용을 참조해서 만들었다. 원래는 restAPI에 대한 정의를 말하고 시작해야 되지만 아직은 설명하기는 어려운 것 같다, 일반적인 api보다 상태를 자유롭게 바꿀 수 있다는 건 확실하다. 아무튼 api를 만들기위해서는 dto가 필요하다. 그러니까 자바빈같은게 필요하다는 뜻이다. 간단하게 @Builder @Setter @Getter public class Delivery { private int id; private String item; private String user; private LocalDateTime deliveryTime; private DeliveryStatus status; } ..