728x90

java 98

try-catch block에서 finally 블록이 필요한 이유

컴파일할 때는 문제가 없던 프로그램도 동작 도중에 종종 오류가 발생한다. 사용자가 항상 개발자의 생각대로 프로그램을 사용하지 않기 때문이다. 숫자만 입력해야하지만 문자열을 입력하기도 하고, 파일을 업로드하기 전 파일의 이름을 지정하지 않기도 한다. 이럴 때 발생하는 오류를 사전에 방지하는 것은 중요하다. 그런데 개발자가 이러한 오류가 발생할 때마다 프로그램이 종료되는 것을 원치 않을 수 있다. 오류를 무시하고 싶을 수도 있고, 그 오류가 발생 했을 때 수행할 적절한 동작을 직접 정의하고 싶을 수도 있다. 이럴 때 활용하는 것이 try-catch-finally 구문이다. public class Main { public static void main(String[] args) { int [] arr = ne..

JAVA 2024.04.16

Java에서 큰 수를 다룰 때 쓰는 자료형이란? (BigDecimal 에 관해)

BigDecimal을 쓰는 이유 Test 자바는 IEEE 754 부동 소수점 방식을 사용해서, 정확한 실수를 저장하지 않고 최대한 완벽에 가깝기를 바라는 근사치 값을 저장하기 때문에 통과하지 못한다. 금융권에서 달러를 다루는 개발자가 double을 이용해서 이런 사소한 값 차이가 발생한다면 부동 소숫점 방식이 아닌, 정수를 이용해 실수를 표현하는 java.math.BigDecimal 클래스를 사용해야 한다. 따라서, Java 언어에서 돈과 소수점을 다룬다면 BigDecimal은 선택이 아니라 필수다. 변수 intValue : 정수. 정수를 저장하는데 BigInteger를 사용한다. scale : 지수. 정확히는 소수점 첫째 자리부터 0이 아닌 수로 끝나는 위치까지의 총 소수점 자리수이다. precisio..

JAVA 2024.04.06

배열 선언 및 초기화(initialization)

배열(Array) 이란? 배열(Array)이란 선형 자료구조(Data Structure)중 하나로, 동일한 타입의 연관된 데이터를 메모리에 연속적으로 저장하여 하나의 변수에 묶어서 관리하기 위한 자료 구조입니다. 가장 기본적인 자료구조인 만큼 C,Java,Python등 거의 모든 언어에 구현되어 있습니다. 배열의 길이는 최초 선언한 값으로 고정되며 위와 같이 인덱스(Index)를 통해 데이터에 접근 할 수 있습니다. 배열(Array) 선언 및 초기화 배열을 선언할때 참조변수만 먼저 선언하여 크기 및 값을 이후에 초기화 하는 것도 가능하고 최초 선언시 부터 배열의 크기 및 값을 할당해 주는 것도 가능합니다. 아래는 여러가지 방법으로 배열을 선언하고 초기화 하는 예제입니다. //크기 할당 & 초기화 없이 배..

JAVA 2023.09.24

Field ‘...’ doesn’t have a default value 오류 해결 방안

어느날 잘되던 API를 체크해보았는데 빌드는 되었지만 런타임 500 오류가 발생하였다. 오류 메시지를 보니 Field '…' doesn't have a default value 라는 메시지를 찾을 수 있었다. 소스코드를 점검해보니 이상이 없었고, 검색해보니 열(컬럼)에 기본값이 따로 지정되지 않았는데 그 열의 값을 뚜렷하게 지정하지 않는 채로 INSERT나 UPDATE 등으로 자료를 넣으면 오류가 발생할 수 있다고 한다. 위 경우는 해당 테이블의 PK에 auto increment 속성이 해제되어 있었고 이를 추가하여 해결할 수 있었다. -- auto increment alter table aaa modify bbb bigint auto_increment; PK에 자동증가 설정 추가 후, API 가 정상동..

Database 2023.08.31

[JWT] Illegal base64url character: ' ' 오류

Postman의 Authorization 탭에서 Type을 Bearer Token으로 설정한 뒤 Token을 입력하고 정상적으로 동작했던 API를 테스트 해보았는데 오류가 발생하였다. 인텔리제이 로그에서는 Illegal base64url character: ' ' 에러로그 메시지가 출력되었다. 에러 로그의 이유는 토큰값을 분해할 때 Base64 형식으로 decode 된 secret key를 사용하여 토큰을 분해하게 되는데, 그 과정에서 오류가 발생하는 것 같다(Base64 형식은 ' '(공백) 을 인식할 수 없다는 것이 이유). 해결 - Postman에서 API 요청할 때, Authorization 탭 대신 Headers 탭에서 Key 컬럼에 Authorization을 입력하고 Value 컬럼에 로그인에..

JWT 인증 2023.08.21

코틀린 컬렉션 타입의 데이터 개수만큼 반복문

fun main() { var data = arrayOf(10, 20, 30) for (i in data.indices){ print(data[i]) if (i !== data.size -1) print(",") } } 위 소스는 배열의 크기만큼 for 문을 반복하게 작성한 소스 indices는 컬렉션 타입의 인덱스 값을 의미하므로 for 문을 반복하면서 0,1,2 값을 i에 대입한다. fun main() { var data = arrayOf(10, 20, 30) for ((index, value) in data.withIndex()){ print(value) if (index !== data.size -1) print(",") } } 위의 소스는 for 문을 반복하면서 인덱스와 실제 데이터를 함께 가져..

SpringEL

SpringEL 타임리프에서는 ${...} 라는 변수 표현식을 사용하여 변수를 사용한다 (선택 변수는 *{...} ) 이 변수 표현식에는 SpringEL이라는 스프링이 제공하는 표현식을 사용할 수 있다. SpringEL Spring Expression Language라는 뜻의 SpringEL (SpEL)은 런타임 시 메서드 호출 및 기본 문자열 템플릿 등의 기능을 제공한다. #{"표현식"} , ${"프로퍼티"} 으로 사용한다. (SpringEL 공식문서 링크 : https://docs.spring.io/spring-framework/docs/3.0.x/reference/expressions.html ) Thymeleaf Variable Expression : ${...} Text Thymeleaf Var..

Thymeleaf 2023.03.18

Entity Manager Factory와 persist, flush, commit

Entity Manager Factory와 persist, flush, commit 연관 관계 학교에서 한 명의 학생이 하나의 반에 속해있는 상황을 가정해보자. class Student { int studentId; String name; Class clazz; } class Class { int classId; String className; Teacher teacher; } OOP 에서는 학생에 대한 객체가 반에 대한 객체를 포함한다. 정확히는 참조를 가지고 있다. 반면, RDB 에서는 참조를 가지는 것이 아니라 반에 대한 참조를 FK 로 대체하고, 반에 대한 데이터를 분리하여 따로 저장해야한다. 즉, 데이터 저장 시에 데이터를 분리하여 2개의 쿼리를 사용해야 하며, 다시 읽을 때는 조인을 통한 재조..

JPA 2023.03.06

PointCut 표현식 정리

PointCut 표현식 포인트컷에는 다양한 명시자를 이용할 수 있습니다. execution Advice를 적용할 메서드를 명시할 때 사용합니다. within 특정 타입에 속하는 메서드를 JoinPoint로 설정되도록 명시할 때 사용합니다. bean 스프링 버전 2.5 버전부터 지원하기 시작했으며, 스프링 빈을 이용하여 JoinPoint를 설정합니다. execution 명시자 execution([수식어] 리턴타입 [클래스이름].이름(파라미터) 수식어 : public, private 등 수식어를 명시합니다. (생략 가능) 리턴타입 : 리턴 타입을 명시합니다. 클래스이름 및 이름 : 클래스이름과 메서드 이름을 명시합니다. (클래스 이름은 풀 패키지명으로 명시해야합니다. 생략도 가능) 파라미터 : 메서드의 파라..

Spring 2023.03.03
728x90