TIL/Java에 해당하는 글 13

  1. @Scheduled / Virtual Thread, @Async, @Synchronized 2025.08.14

    서비스를 운영하다 보면 배치(Batch)를 이용해 주기적으로 실행되어야 하는 작업을 자동화할 일이 생긴다.주기적으로 데이터의 상태를 확인하고 업데이트를 한다던가,로그를 쌓거나 보고서를 작성하는 등 서비스의 특성에 따라 다양한 작업이 생길 수 있다. 아무튼 이런 시스템 배치 작업을 하기 위해...Spring Boot에서는 Spring Batch 또는 스케줄러(@Scheduled 어노테이션)를 이용해 시스템 배치를 이용할 수 있다.일반적으로 대량 데이터 처리, 단계별 로직과 같은 복잡한 작업을 하는 경우에는 Spring Batch(의존성 추가 필요),비교적 단순하고 반복 작업인 경우에는 스케줄러 기반으로 구성한다.(스프링 기본제공) Spring Batch is a lightweight, comprehensi..


  2. @Conditional 로 특정 빈 등록 조건 만들기 2025.03.21

    테스트 환경에서는 실행되지 않아야 하는 파일이 있을 수 있다.그럴 때? @Conditional 어노테이션을 사용하면 쉽게 조건을 만들어서 구현할 수 있다. @Conditional 어노테이션은 정의된 조건에 맞춰 빈 등록을 할 지 말지 정해준다.예를 들어서, 개발 환경에서만 따로 로그를 찍는 빈이 있다고 해 보자. 간단히 Condition을 구현해서, matches 함수를 오버라이드하면 커스텀 조건을 작성할 수 있다.true를 리턴하는 조건에서 Conditional 조건을 만족하여 작동하게 된다.아래는 실행시 지정한 프로파일이 dev 일 때만 true를 리턴한다.public class LoggingCondition implements Condition { @Override public boole..


  3. JPAㅠ 2025.03.14

    보호되어 있는 글입니다.


  4. [Gradle] --project-prop 옵션으로 특정 파일 제외하여 빌드하기 2025.03.07

    이번에 Swagger를 활용해 API 문서를 작성하면서,개발 서버에서만 쓰이는 내부용 컨트롤러에 아예 접근할 수 없도록 처리할 필요가 있었다. @Hidden, @Profile 등 여러 방법을 찾아 보다 gradle로 아예 파일 자체를 빼고 빌드하기로 했다. https://docs.gradle.org/current/userguide/command_line_interface.html#sec:environment_options Command-Line Interface ReferenceGradle provides several built-in tasks which show particular details of your build. This can be useful for understanding your bu..


  5. 세션 관리 삽질 2025.02.25

    보호되어 있는 글입니다.


  6. Cacheable 삽질 2025.02.05

    서버 내에서 자주 쓰이는 값을 캐싱처리해야 할 일이 있었다.단순히 String이 아니라, 좀 더 편하게 꺼내 쓰기 위해 자바 객체로 담아 redis 캐시로 저장하기로 했다! 하지만...DefaultSerializer requires a Serializable payload but received an object of type... 기본 직렬화를 하기 위해서는 Serializable한 데이터가 있어야 한다는 에러 메시지가 떴다. redis에 캐시를 저장할 때, redis는 데이터를 hash해서 저장한다.그렇기 때문에, redis에 저장할 클래스는 Serializable을 implement해서 만들어야한다! Servlet.service() for servlet [dispatcherServlet] in co..


  7. @JsonManagedReference와 @JsonBackReference 2024.10.31

    보호되어 있는 글입니다.


  8. 프로파일별로 다른 파일이 실행되도록 세팅하기 2024.08.02

    백엔드를 만들 때, 프로파일을 나눠 빌드시 설정한 프로파일에 따라 기능을 제한해야 하는 경우가 있다.예를 들어, 어떤 편의 기능은 좀 더 상위 프로파일에서만 지원되게 한다던가,같은 메서드를 사용해도 프로파일에 따라 로직이 달라지는 경우가 있을 수 있다. 이런 부분을 구현하기에 앞서 먼저 기본적인 테스트를 해 봤다.어떤 Service에 대한 인터페이스를 두고 각 프로파일별로 구현한 다음,설정된 프로파일에 따라 각 구현된 Service 내의 메서드가 실행되도록 하려 한다. 우선 폴더 구조는 아래와 같이 설정했다.core에 구현할 서비스의 Test 인터페이스를 생성하고, 프로파일의 이름으로 된 디렉토리 내에서 구현할 예정이다.  package com.example.demo.core;public interfac..


  9. Execution failed for task ':compileJava'. 2024.07.29

    Execution failed for task ':compileJava'.> Could not resolve all files for configuration ':compileClasspath'. > Could not find org.mybatis.spring.boot:mybatis-spring-boot-starter:. Required by: project :Possible solution: - Declare repository providing the artifact, see the documentation at https://docs.gradle.org/current/userguide/declaring_repositories.html build.gradle이나 pom.xml..


  10. [SpringBoot] *.properties 내 값 enum 클래스로 받아 관리하기 2024.07.26

    지금까지는 서버가 작동되는 환경에 대한 상수를 단순히 String으로만 관리해 왔다.플랫폼 서버 개선을 진행하면서 properties로 해당 환경변수를 받고,또 해당 상수를 서버 내부에 enum으로 관리하여 사용할 수 있는 값을 한정하도록 설정했다. 1. enum 클래스 생성package kr.doodoo.common;public enum ServerMode { WINDOW("WINDOW"), MAC("MAC"), ETC("ETC"); private String mode; ServerMode(String mode) { this.mode = mode; } public String getMode() { return this.mode; } ..