자바 54

IO 와 NIO 를 이용한 입출력 (2/2)

NIO자바 4에서 새롭게 등장하고 7에서 재정비된 NIO 는 IO 와 비교해 여러 강점을 가진다. 1. MMIO(Merory-Mapped IO) 방식으로 버퍼 지원2. 넌블로킹 모드 지원3. Scatter/Gather 지원4. 파일락 이전 포스팅에 1,2,3, 의 내용이 정리되어 있다. 파일락의 경우, 어떤 파일을 수정하는 동안 다른 쓰레드에서 읽기 작업을 가능하게 할지 설정하는 기술이다. MMIO일반적으로 I/O 작업이 이뤄질때, 이를 위한 별도의 메모리 공간이 할당된다. 문제는 I/O 작업이 일어날 때마다 이 별도의 메모리 공간(자바에서는 Heap)을 사용하기 위한 시스템콜이 일어나고, 이 작업이 상당한 자원을 소모한다는 것이다.이 문제를 해결하기 위해 운영체제는 MMIO 라는 기술을 지원한다.mmi..

공부/java 2024.05.17

IO 와 NIO 를 이용한 입출력 (1/2)

자바에는 입출력을 위한 I/O API 존재한다.I/O 클래스는 두개가 존재하는데, 기존 I/O 와 자바4에 등장해서 자바 7에 재정리된 버퍼를 사용하는 New I/O 다. 버퍼버퍼에 대해 쉽게 이해하기 위해 먼저 마트에서 장을 본다고 가정해보자. 살 물건을 하나씩 계산대로 가지고 가기 보다는, 바구니에 담아서 한번에 가져가는 것이 이동시간도 적게 걸리고 힘도 덜 들 것이다. 버퍼는 바로 이 바구니와 비슷한 역할을 한다. 즉, 데이터를 다루기 전 일정 크기만큼 한번에 가져와 가지고 있는 저장소다. 덕분에 데이터를 사용하기 위해 매번 데이터를 찾으러 갈 필요가 없어 실행 시간이 빨라진다는 장점이 있다. 기본 I/O 클래스를 이용한 버퍼코드로 살펴보기에 앞서 일부 세팅이 필요하다.1. 더미 파일 생성파워쉘에서..

공부/java 2024.05.13

자바 - Java 8 date/time type `java.time.LocalDateTime` not supported by default: add Module "com.fasterxml.jackson.datatype:jackson-datatype-jsr310" to enable handling ...

발생ObjectMapper 을 이용한 객체 직렬화 도중에 문제가 발생했다. 원인에러 메시지에 나와있다.요약하면 자바 8 LocalDateTime 을 제공하지 않으니 ' jackson-datatype-jsr310' 모듈을 추가하라는 말이다. 해결먼저 jackson 버전을 확인해야 한다. jackson 2.8.0 이전 버전에는 jackson-datatype-jsr310 모듈을 추가할수 없다.다행히 내 jackson 버전은 2.15.3 버전이다.그런데 이상한 점을 발견했다. 이미  jackson-datatype-jsr310 모듈이 추가되어 있는 것이다. ObjectMapper 란?직렬화와 역직렬화를 제공하는 Jackson 라이브러리 클래스다. 다만 복잡한 데이터 유형은 사용자가 직접 어떤 식으로 직렬화를 할지..

에러 기록 2024.05.05

자바 - Junit5 Jupiter 를 이용한 단위 테스트 시작

1. 프로젝트의 main 폴더 아래에 test 폴더를 만든다. test 폴더 내부에 테스트 클래스를 만들지 않으면 정상적으로 junit 클래스를 import 해올수 없어 테스트 코드를 실행할수 없다. 2. @Test 어노테이션을 이용한 테스트 코드 메서드 작성 @Test void test(){ } 해당 어노테이션이 붙은 메서드는 main 클래스처럼 실행이 가능해진다. main 클래스가 그렇듯, 반환값은 존재하지 않는다. **** 만약 @Test 어노테이션의 import 클래스가 org.junit.jupiter.api.Test 가 아니라면 라이브러리를 추가해야 한다. gradle의 경우 다음의 코드를 작성해줘야 한다. dependencies { testImplementation 'org.junit.jupi..

공부/java 2024.04.03

JSP를 사용하면서

최근 인턴생활하고 있는 회사가 JSP, MyBatis, Spring-Legacy, Eclipse를 사용한다. 모두 사용해본적 없는 것들이기에 많은 시행착오를 겪었다. 이에 여기에 새롭게 배운 기본적인 내용들을 정리한다. JSP( Java Server Pages ) 자바 뷰 템플릿. 단독으로 웹 브라우져에 띄워 확인할수 없다. 일부 전용 태그들이 존재한다. 기본 문법 1.Directives (지시자) 속성과 값에 따라 자바 코드를 생성한다. page, taglib, include가 있으며, 주로 jsp 페이지와 관련된 속성이나 라이브러리를 임포트 하는 등의 용도로 사용된다. 2. Scriptlet Elements(스크립트릿) jsp 페이지 안에서 자바 코드를 작성할때 사용한다. 해당 코드는 서블릿 파일이 ..

공부/JSP 2023.10.19

(9)빈 스코프

스코프란? 빈의 존재 방식을 말한다. 스코프 종류에 따라 빈은 컨테이너에게 관리받는 시점을 조절하거나 객체가 유지되는 기간을 설정할수 있다. 스코프의 종류 싱글톤: 기본 스코프, 스프링 컨테이너의 시작과 종료까지 유지되는 가장 넓은 범위의 스코프이다. 프로토타입: 스프링 컨테이너는 프로토타입 빈의 생성과 의존관계 주입까지만 관여하고 더는 관리하지 않는 매우 짧은 범위의 스코프이다. 웹 관련 스코프 request: 웹 요청이 들어오고 나갈때 까지 유지되는 스코프이다. session: 웹 세션이 생성되고 종료될 때 까지 유지되는 스코프이다. application: 웹의 서블릿 컨텍스트와 같은 범위로 유지되는 스코프이다 스코프의 등록법 @Scope("[스코프 종류]") 를 사용하면 된다. 자동 등록 빈이건 수..

카테고리 없음 2023.06.05

(8) 빈 생명주기 콜백

스프링 빈(싱글톤)의 생명 주기 스프링 컨테이너 생성 -> 스프링 빈 생성(생성자 함수 실행, 생성자 주입 실행) -> 의존관계 주입(생성자 주입을 제외한 의존관계 주입) -> 초기화 콜백 -> 사용 -> 소멸전 콜백 -> 스프링 종료 초기화 콜백, 소멸전 콜백은 스프링에서 자체적으로 지원하는 기능이다. 코드로 예시를 살펴보자. #AutoConnect public class AutoConnect { private String fieldA; public AutoConnect() { System.out.println("AutoConnect 객체 생성됨"); System.out.println("field=" + fieldA); connect(); call("초기화 연결 메시지"); } public void s..

카테고리 없음 2023.06.05

(6)빈 자동 등록과 자동 주입

@ComponentScan 과 @Autowired 개발자의 편의를 위해 @Configuration 클래스 내에서 @Bean을 통해 수동으로 등록하지 않고 자동으로 등록하는 방법이 존재한다. @ComponentScan 어노테이션을 사용하면, @Component 어노테이션이 붙은 클래스가 자동으로 빈으로 등록된다. 빈 이름은 첫글자가 소문자인 클래스 이름 그대로 설정된다. #AutoAppConfig @Configuration @ComponentScan(excludeFilters = @Filter(type = FilterType.ANNOTATION, classes = Configuration.class)) public class AutoAppConfig { } // 기존에 만든 Config 클래스를 제외하기 ..

공부/springboot 2023.05.15

(5) 스프링 컨테이너 - 싱글톤

스프링은 태생적으로 웹 어플리케이션에 특화되어 있는데, 웹 어플리케이션은 보통 같은 요청이 동시다발적으로 들어오곤 한다. 만약 100명의 고객이 동일한 요청을 한다고 가정해보자. 그러면 동일한 역할을 하는 객체를 100개를 생성하게 될 것이다. 그런데 그 요청이 모든 고객에게 공통적인 사항이라면 (ex - 공지사항 출력, 판매 상품 출력 등) 100개의 객체를 생성하는 것보다 1개의 객체를 100명이 공유하는게 메모리 측면에서 더 효율적일 것이다. 즉, 싱글톤을 사용해야 한다. 순수 싱글톤 만들기 자바 코드를 사용하지 않고 싱글톤 패턴을 만들수 있다. 핵심은 아래와 같다. 1. static키워드를 사용해서 미리 자신의 인스턴스를 만들어두고, final키워드를 더해 재할당이 안되도록 만든다. 2. 매개변수..

공부/springboot 2023.05.14

(4) xml을 통한 빈 등록과 BeanDefinition

빈을 XML로도 등록이 가능하다, 이는 매우 귀찮고 최근에는 사용하지 않는 한물간 방식이다. 따라서 등록 원리에 대해서만 간단하게 설명하고 넘어가도록 하겠다. ApplicationContext ac = new GenericXmlApplicationContext("appConfig.xml"); AnnotationConfigApplicationContext() 처럼 GenericXmlApplicationContext를 사용해 xml파일을 넘기면, 해당 파일 내부에서 Bean으로 등록하도록 설정한 클래스들이 빈으로 등록된다. 아래의 xml파일을 보자. id 는 빈이 등록되는 이름, class는 빈으로 등록할 클래스의 경로가 된다. 만약 빈으로 등록하려는 객체가 생성자 함수를 통해 매개변수를 주입받아야 하면 다..

카테고리 없음 2023.05.10