프로세스와 쓰레드 프로세스 : 실행중인 프로그램 쓰레드 : 프로세스안에서 작업을 수행 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; } ..
enum : 열거형이라고 불리며, 서로 연관된 상수들의 집합이라고 불린다. 원래 자바에는 enum클래스가 존재하지 않았지만, JDK1.5에 추가되었다고 한다. C언어 같은 언어에서는 enum클래스의 역할은 단순히 상수들의 집합으로 사용되었지만, 자바는 타입까지 비교가 가능하다. enum을 만드는 방법 기본적으로 public enum Language { C, JAVA, KOTLIN, JAVASCRIPT } 이렇게 만들면 된다. 이들은 왼쪽부터 오른쪽으로 0번부터 3번으로 측정된다. System.out.println(Language.C.ordinal()); System.out.println(Language.JAVA.ordinal()); System.out.println(Language.KOTLIN.ordin..
자바가 제공하는 예외 계층 구조 비유 우리가 병이 생긴다면, 병원으로 간다. 그 병이 치명적일 수도 있고, 치명적이지 않을 수 있다. 만약, 그 병이 치명적이라고 가정한다면, 제대로 치료를 받지 않으면 죽게 될 수도 있다. 만약, 그 병이 치명적이지 않는다고 한다면, 병원에 가지 않고 자가 치료가 가능할지도 모른다. 실제 프로그램도 마찬가지다. 에러가 치명적이라면, 그 예외를 해결을 해야된다. 그래야 프로그램을 계속 유지할 수 있기 때문이다. 컴파일 에러 가벼운 감기 처럼(아닌 분들도 계시지만 ㅜㅜ),우리가 코드상에서 스스로 해결할 수 있는 에러도 존재한다. 이것을 컴파일 에러라고 한다. 하지만 이것도 치료하지 않는다면, 죽을 수도 있다. 이것을 치료조차 하지 않는다면? 여기서 알 수 있는 건 아무리 가..
프록시는 무엇을 뜻하는 걸까? 대안이라는 뜻을 가지고 있다. 가장 대표적인 예로 JPA를 들 수 있다. 간단하게 JPA코드를 작성해보겠다. public interface BookJpaRepository extends JpaRepository { } @SpringBootTest class BookJpaRepositoryTest { @Autowired BookJpaRepository bookJpaRepository; @Test void test() { System.out.println(bookJpaRepository); } } 인터페이스로 만들었지만.. 다양한 메소드를이 나오는 것을 확인 할 수 있다. 물론, 다른 인터페이스를 상속한다음 실행해도 위와 같은 결과는 나온다. 하지만.. 특정 메소드를 실행한다고..
네트워크에서 인터페이스는 포트를 지칭하는 말이다. 즉, 인터페이스로 어떤것을 사용할지 알 수 있게 도와주는 역할을 한다. 자바에서도 마찬가지다. 일반적으로 인터페이스는 규약을 정의할때 사용이 되어진다. 그래서 직접 구현하는 것보다, 추상적으로 서로간의 "약속"을 정할때 사용된다. 그러면 인터페이스는 어떻게 만드는걸까? 간단히 public interface Interfaces { } class => interface로 바꿔주면 된다. 구현하는 방법은 크게 2가지가 존재하는데, 다른 클래스에서 구현하는 방법 public abstract void hello(); 로 구현해되지만 public abstract는 생략이 가능하다. 먼저 메소드 몇 개를 구현해보자. public interface Interfaces ..
리플렉션을 학습하였다. 리플렉션에 대해 살짝 언급한다면, 클래스에 대한 정보를 아무런 제약없이 가져올 수 있다는 것인데... 이것을 잘못 사용할시.. 프로그램의 성능 이슈가 있을 수 있다. 또, 이것은 접근지시자 private도 접근할 수 있기 때문에 신중에 신중을 기여하면서 사용해야한다. 만약, 이렇게 사용할시, 엄청난 문제가 발생할지도 모른다. 리플렉션으로 무언가를 만들 수 는 없을까? 우리는 간단하게 DI 의존성 주입을 만들 수 있다. DI는 프로그램이 만들어지는 순서를 역으로 만든다는 것인데, 원래 객체가 들어가야 되지만 이것을 한번 꺽어서 만든다는 것이 특징이다. 이제 직접 만들어 보자. 일단 어노테이션부터 만들어야 된다. 왜냐하면 어노테이션으로 값을 찾기 때문이다. @Retention(Rete..
스프링을 공부하다보면.. 빈을 주입하는 (객체를 만들어주는)... 것이 나온다. @Repository public class SchoolRepository { } @Service public class SchoolService { @Autowired SchoolRepository schoolRepository; } 그리고 이것을 테스트 해보자. @SpringBootTest class SchoolServiceTest { @Autowired SchoolService schoolService; @Test void test() { System.out.println(schoolService.schoolRepository); } } 나는 분명히 new 키워드를 이용해서 만들지도 않았다. 그런데 정상적으로 객체값이 ..