[Java] Exception
·
Language/Java
예외란?프로그램 실행 중 발생할 수 있는 비정상적인 상황을 나타내며, 이를 처리하기 위한 메커니즘자바에서는 예외를 Throwable 클래스와 그 하위 클래스(Exception, Error)로 표현Error: 시스템 수준에서 복구할 수 없는 문제(JVM 내부 오류 등)Exception: 애플리케이션 수준에서 복구 가능한 문제Unchecked Exception : RuntimeException과 그 하위 클래스Checked Exception :Exception 을 상속하지만 RuntimeException의 하위 클래스가 아닌 예외들예외 처리의 개념은 자바 이전에도 존재했지만, 자바는 이를 더 정형화하고 언어 차원에서 강력하게 지원한다. 자바의 Checked Exception은 개발자가 예외 처리를 강제함으로..
[JPA] orphanRemoval, CasecaseType.REMOVE
·
Spring Framework/JPA
orphanRemoval과 casecade는 @OneToMany에서 삭제 동작을 제어하는 두 가지 옵션이다. orphanRemoval=true, CascadeType.REMOVE 두 옵션 모두 부모-자식 관계에서 자식 엔티티를 삭제하는 설정이지만 차이가 있다.casecadecasecade는 부모 엔티티의 상태 변화가 자식 엔티티에 전파되도록 설정하는 옵션으로 부모 엔티티가 생성/수정/삭제 될 때 자식 엔티티에도 부모 엔티티를 따라 데이터베이스에 생성/수정/삭제되록 설정한다. 이 옵션에 지정할 수 있는 다양한 CascadeType이 있다.PERSIST: 비영속 상태의 부모 엔티티를 영속상태로 변경할 때 자식 엔티티도 영속 상태로 변경MERGE: 준영속 상태의 부모 엔티티를 영속상태로 변경할 때 자식 엔티티..
[Java] call by value, call by reference
·
Language/Java
call by value와 call by reference는 함수 호출 시 매개변수를 전달하는 방식이다. 함수 호출 과정에서 함수의 매개변수가 전달될 때 원본 데이터를 복사하는 것인지, 원본 데이터의 참조를 전달한 것인지를 구분하는데 사용한다. 함수 내부에서 원본 데이터를 변경할 수 있는지의 차이가 있다.call by valuecall by value는 값을 복사해서 함수로 전달하는 방식이다. 함수는 전달받은 값의 복사본을 사용하며 함수 내부에서 값을 변경하더라도 호출한 쪽의 원본 데이터에는 영향을 미치지 않는다.call by referencecall by reference는 값이 저장된 메모리의 주소를 전달하는 방식이다. 함수는 전달받은 주소를 통해 원본 데이터를 직접 참조하기 때문에, 함수 내부에서 ..
리더보드 만들기 - 1
·
프로젝트
최근 css/js로 애니메이션 효과를 넣는게 재미있어서 이것저것 만들어 보다가 리더보드를 만들면 어떨까 생각했다. 처음에는 깔끔한 UI로 구성된 Vue 컴포넌트를 만드려고 했는데 실시간 순위라는 주제가 공부해볼만한 내용인 것 같아 백엔드/프론트엔드 모두 구현해보려고 한다. 일단 어떻게 진행할지 간단히 기획해 봤다.순위가 변하는걸 보여주는 Vue 컴포넌트 구현유저, 점수 데이터를 조회하는 API 구현실시간으로 점수 변동이 반영되도록 Vue 컴포넌트 수정실시간에 대해서는 좀 더 시나리오를 고민해봐야겠다. 점수 변동이 있을 때마다 반영된 데이터를 보여줄지, 일정 시간마다 조회할지에 따라 백엔드 구현이 달라질 것 같다.기술 스택은 Springboot, Vue.js를 사용하고 필요하면 redis를 추가할지도 모른..
[JPA] 연관 관계
·
Spring Framework/Spring
JPA를 사용하면서 두 엔티티간 일다대 관계를 설정하는 경우가 많았다. 어쩔때는 중간 테이블이 생기고 어쩔때는 데이터베이스에 데이터가 저장이 안되고, 그럴때마다 그냥 mappedBy 추가하고 joinColumn 추가하고 넘어갔다. 특히 두 엔티티 관계를 설정할 때 연관관계의 주인이라는 개념을 잘 이해하지 못했다. 아직 제대로 개념을 익히지는 못했지만 두 엔티티 관계 설정을 해보며 어떤 변화가 생기는지 테스트해봤다.기본 코드아래의 Parent, Child 두 엔티티에 일대다 관계를 설정할 것이다. 각 엔티티에 @ManyToOne이나 @OneToMany를 추가해보며 테스트 코드를 실행했다.@Entitypublic class Parent { @Id @GeneratedValue(strategy = G..
[Java] sealed
·
Language/Java
의도하지 않은 클래스가 상속될 경우 예상치 못한 동작이나 버그가 발생, 또는 라이브러리나 공통 클래스에서 상속 제한 필요JDK 17부터 sealed를 도입클래스 계층 구조에 대한 제어를 더욱 강화클래스와 인터페이스가 허용된 하위 유형을 정의할 수 있다.public interface Loan { double calculateInterest();}어떤 클래스든지 Loan을 구현 가능한 상태sealed 인터페이스 정의sealed 인터페이스와 허용하는 하위 클래스를 선언 방법public sealed interface Loan permits HomeLoan, PersonalLoan, AutoLoan { double calculateInterest();}Loan을 sealed로 지정, HomeLoan, ..
[Typescript] hasText
·
Language/JavaScript
타입스크립트에서 StringUtils.hasText를 어떻게 만들까구현하며 알게된 타입스크립트 문법들function hasText (str?: string | null): boolean { return !!str?.trim()}주요 문법Optional Chaining(?.)str이 null 또는 undefined일 경우 바로 undefined를 반환null 또는 undefined이 아니면 trim()을 실행해 양 끝의 공백을 제거한 문자열 반환**!!**부정 연산자 !를 두 번 사용Optional Chaining의 결과로 나온 null, undefined를 boolean타입인 false로 변환trim()으로 만들어진 문자열은빈 문자열("")이라면 false문자를 가진 문자열이면 true기타위에서 구..
[Typescript] User Defined Type Guards
·
Language/JavaScript
vue-core의 코드 분석 중 inject()의 구현부에서 isFunction()이라는 함수를 보게되었다. '함수여부를 어떻게 판별할까?'하고 정의를 찾아보니 아래와 같은 코드가 있었다.export const isFunction = (val: unknown): val is Function => typeof val === 'function'내가 헷갈렸던 부분은 반환 타입으로 주어진 val is Function이었다. 파이썬에서만 봤지 타입스크립트에서 is를 사용하는걸 처음봐서 검색해보니 User Defined Type Guards라는 개념을 찾을 수 있었다.User Defined Type Guards란 특정 조건을 만족하는지 확인하여 컴파일러에게 해당 조건이 참일 경우 변수나 객체의 타입을 안전하게 판..