분류 전체보기 149

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

스프링 - webSocket 을 이용해서 채팅 구현하기

webSocket : 2011년에 나온 비교적 최신 기술이며, http 처럼 일종의 통신 규약이다. 한번 연결된 이후에 계속해서 연결 상태가 유지되는 통신이라고 생각하면 된다. 흐름: 1. 스프링 내부에서 webSocket 요청을 받을 endPoint 설정 2. 자바 스크립트 - 스프링간의 webSocket 통신 연결 3. 요청(메시지)이 들어올시 처리될 코드 작성 실제 코드: 0. websocket 을 사용하기 위한 라이브러리 추가 implementation 'org.springframework.boot:spring-boot-starter-websocket' 1. WebSocketConfig 클래스 @Configuration @EnableWebSocket @RequiredArgsConstructor p..

공부/springboot 2024.03.08

스프링 - url 요청시 이전 url 에서 Error during execution of processor 'org.thymeleaf.spring6.processor.SpringInputGeneralFieldTagProcessor' (template: "layout-main/layout" - line 135, col 19) 가 발생하는 오류

이 url 에서 이 url 로 이동하니 이처럼 해당 html 을 열수 없다고 나온다. 간단한 템플릿 오류로 타임리프 문법 실수를 생각했는데, 그 아래의 에러 내용을 더 보다보니 이해할수 없는 내용이 나왔다. layout-main/layout 파일에서 오류가 발생했다는 말이다. 그리고 layout-main/layout 는 이전 화면, localhost:8080 의 화면이다. 다시 정리하면, 이전 화면에서 오류가 나서 다음 화면으로 못넘어간다는 말이 되는데, 문제는 정작 "/" 로 요청을 날릴때는 어떤 오류도 발생하지 않는다는 것이다. 그렇다고 "/club?clubNo=1" 의 url 이 "/" 으로 가거나, "layout-main/layout" html 파일에 접근하지도 않는다. 더 내려보면 "layout..

카테고리 없음 2024.03.02

스프링 JPA 과 pk값이 여러 컬럼인(복합키) 테이블 연결하기 - jpa

DB와 연결 스프링간의 연결을 쉽게 만들어주는 JPA는 일반적으로 다음과 같이 사용한다. 1. DB의 테이블을 나타내는 Entity 클래스 생성. 컬럼값을 값으로 받기 위한 필드값을 생성해야 한다. 2. JpaRepository 인터페이스를 상속받는 인터페이스를 생성한다. 3. JpaRepository 제네릭에 1에서 생성한 엔티티 클래스와 pk와 연동되는 필드값의 데이터 타입을 입력한다. 그러나 pk값이 하나의 컬럼으로 설정된 테이블이 아닌, 여러 컬럼이 합쳐진 형태로 존재하는 테이블은 1번 엔티티 클래스 생성부터 방식이 다르다. 1. 엔티티 클래스 생성 기존에 pk값은 Long 이나 String 같은 기본 타입으로 표현 가능했으나, 컬럼이 여러개로 이뤄진 pk값은 이것이 불가능하다. 따라서 pk값을 ..

에러 기록 2024.02.28

Spring validation 과정 중, properties에서 지정한 message 가 출력되지 않음. - 타임리프, 스프링 오류

문제 상황. 오류 메시지를 properties 파일을 이용해 직접 작성하려고 한다. 그러나 옳바르게 문구가 나오지 않고 기본 오류 문구만 출력된다. test 환경에서 MessageSource 를 주입받아 확인해보면 errors.properties 파일 내부의 문구가 옳바르게 MessageSource 빈에 등록된건 확인이 가능하다. DTO @Data @AllArgsConstructor public class MemberJoinForm { @NotBlank private String id; @NotBlank private String pw; @NotBlank @Size(min = 2, max = 5) private String name; @Size(min = 4, max = 15) private String..

에러 기록 2024.02.19

~~~ because "this.redisTemplate" is null - 스프링 REDIS 테스트 오류

스프링에서 redis를 적용한뒤 테스트 코드를 작성하고 돌렸을시 다음과 같은 오류가 발생한다. 그러나 본 어플리케이션 환경에서는 잘 돌아가기에 원인을 찾는데 시간이 오래 걸렸다. 원인: bean으로 등록된 객체들을 못찾아와 생기는 문제 해결: @SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT) public class RedisTest { .... } @SpringBootTest 어노테이션을 추가해 본래 어플리케이션에 추가된 설정을 테스트 환경에서도 똑같이 재현한다. 즉, redisTemplet 을 빈으로 등록한다. 다만 이를 사용하면 단위 테스트 속도가 느려질수 있다는 단점이 존재한다.

에러 기록 2024.02.04

java.lang.IllegalArgumentException: Name for argument of type [java.lang.Integer] not specified, and parameter name information not available via reflection - 스프링. 파라미터 어노테이션에 자동 이름 부여가 안되는 오류

오류 상황 @GetMapping("/test") public String test(@RequestParam Integer data){ return "ok"; } 이 컨트롤러에 http://localhost:8080/test?data=10 요청시 java.lang.IllegalArgumentException: Name for argument of type [java.lang.Integer] not specified, and parameter name information not available via reflection. Ensure that the compiler uses the '-parameters' flag. 오류가 터지며 응답이 안된다. 원인 원래는 자동으로 변수 이름이 @RequestParam..

에러 기록 2024.01.31