Gradle, Java, Springboot 버전 업그레이드Gradle Version upgrade6.6.1 → 6.8.3 → 7.2 → 8.6SpringBoot version upgrade2.3.4 → 2.7.7 → 3.0Java version upgrade8 → 17java { sourceCompatibility = '17'}주요 변경 사항Javax.servlet.http → Jakarta.servlet.httpjavax → jakarta 패키지 변경jakarta.servlet.http 내부 클래스들HttpServletRequest, HttpSession, HttpServletResponsejakarta.persistence 의 어노테이션들@Table, @Entity, Column, @Id, @Gen..
Backend
공통점둘 다 객체를 비교하는 기능을 가지는 인터페이스라는 점에서 동일합니다.Comparable// Comparable 인터페이스 구현, int compareTo(T t1, T t2) 메서드 오버라이드 필요class Item implements Comparable { int value; @Override public int compareTo(Item i2) { return value - i2.value; }}Comparator// Comparator 인터페이스 구현, int compare(T t) 메서드 오버라이드 필요class Item implements Comparator { int value; @Override public int compare(Ite..
Map map = new HashMap();Set> set = map.entrySet();Iteratory> iter = set.iterator();while (iter.hasNext()) { String key = iter.getKey(); int value = iter.getValue();}
오래전 만들어두었던 사이드 프로젝트를 리팩토링하는 작업을 진행중에 소소하게 막힌 부분들 중 간단히 작성할 수 있는 내용을 남긴다. 현재 리팩토링하는 프로젝트는 SpringBoot 3.2.3 버전에 JPA 관련해서는 `spring-boot-starter-data-jpa` 라이브러리를 사용한다. 기본적으로 모든 레파지토리는 `JpaRepository` 인터페이스를 상속하는 형태로 존재한다.문제가 된 부분은 게시글(BoardImp)을 조회할 때, 대소문자 구분없이 들어온 값이 포함되는 데이터를 조회하는 기능을 작성하는 것이었다. `LOWER()`와 `LIKE %문자열%`를 함께 쓰고 싶었다. 실행되길 원하는 쿼리문은 아래와 같았다.SELECT b.* from board_imp bWHERE (LOWER(b.ti..
`application.properties`를 사용할 때는 `ResourceBundle.getBundle("application");` 정도만 작성해도 됐지만, .yaml(.yml) 파일 사용시에는 별도의 라이브러리를 사용해주어야 한다.build.gradleimplementation 'dev.akkinoc.util:yaml-resource-bundle:2.12.3' yaml 파일을 불러오는 부분private static ResourceBundle properties = ResourceBundle.getBundle("application", YamlResourceBundle.Control.INSTANCE);Integer port = properties.get("server.post"); // 포트 정보 조회
앞서, JPA를 이용해 데이터를 조회해와 클라이언트로 반환하는 API를 작성할 때에는 반환 타입으로 엔티티를 그대로 사용하면 안된다. 엔티티를 바로 반환할 때의 문제점은 아래 더보기를 참고하자.더보기엔티티를 직접 반환할 때의 단점 1. 엔티티를 직접 노출하게 될 경우 엔티티가 수정되면 API 스펙이 변경되어 버린다. 예를 들어 name 필드를 username으로 변경하게 되면, API를 호출해 Response를 받는 클라이언트측 입장에서는 갑자기 name 데이터를 제대로 가져오지 못하는 경우가 발생한다.2. 엔티티는 다양한 스펙의 API에 대응할 수 있어야 한다. 하나의 API에 의존하는 엔티티는 다른 API 스펙에 유연하게 대처할 수 없다.3. 프레젠테이션 계층을 위한 로직이 엔티티에 추가된다. 엔티티..
JPA는 DB 데이터와 Java Entity를 맵핑해주는 역할을 한다. 이 때, 영속성 컨텍스트(Persistence Context)를 중심으로 엔티티를 맵핑하고 관리한다. 따라서 영속성 컨텍스트라는 개념 없이는 JPA를 이해하기 어렵다. 영속성 컨텍스트(Persistence Context) 영속성(Persistence)의 사전적 의미는 ‘영원히 계속되는 성질이나 능력’이다. 데이터의 상태를 영구히 지속되게 하는 방법은 DB에 저장하는 방식을 떠올리기 쉽다. 하지만, 이 영속성 컨텍스트가 데이터를 관리한다는 말이 실제로 데이터를 DB에 저장하는 것은 아니다. 영속성 컨텍스트는 일종의 논리적인 영역이다. 한번 DB에서 조회해온 데이터는 영속성 컨텍스트에서 관리하며 이를 ‘영속 상태’에 있다고 한다. JPA..
클래스 Member의 구조 @Table(name = "member") @Entity @Setter @Getter @ToString(exclude = "certKey") @Builder @AllArgsConstructor @NoArgsConstructor(access = AccessLevel.PROTECTED) public class Board { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; @Column(name = "title", nullable = false) private String title; @Column(name = "content", nullable = false) private String content..
Java 소스 코드의 실행 과정요약자바 파일(.java)은 javac(=java compiler)에 의해 바이트 코드(.class)로 컴파일된다.JVM의 클래스 로더(Class Loader)가 필요한 클래스들을 로드 및 링크하여 JVM 메모리(Runtime Data Area)에 올린다.Java는 런타임(컴파일 타임 X)에 클래스를 처음 참조할 때에는 해당 클래스를 로드하고 링크하는 동적 로드를 한다. 이 동적 로드를 수행하는 부분이 JVM의 클래스 로더이다.클래스 로더의 특징계층 구조 : 부트스트랩 클래스 로더 > Extension 클래스 로더 > System 클래스 로더 순위임 모델 : 클래스 로더끼리 로드를 위임하는 구조로 동작한다. (이전에 로드 된 클래스인지 확인하기 위해 클래스 로더 캐시를 확인..
1. Test Code 구조 AAA Pattern & GWT Pattern Arrange : 준비 Act : 실행 Assert : 단언/검증 💡 GWT Pattern : Given - When - Then 단계를 거치는 패턴으로, AAA의 각 단계와 대응된다. 2. Assertions Assertions.assertEquals(T expected, T actual) : 값 검증 Assertions.assertThrows(T expected, Executable e) : Exception 검증 // given Double num = 0.0; // when & then Assertions.assertThrows(RuntimeException.class, () -> { Double val = 1.0; val ..