반응형

back end/java 51

spring boot에서 Cache 사용하는 방법

개발 환경   개발 환경버전java17Spring Boot3.4.4buildGradleIDEIntelliJ IDEA 2022.3DBH2ORMJPA  Cache Annotation 🗂️ @Cacheable목적: 메서드 실행 결과를 캐시에 저장하고, 다음 호출 시 캐시된 결과를 반환합니다.작동 방식:지정된 캐시에 해당 키가 존재하면 메서드를 실행하지 않고 캐시된 값 반환캐시에 값이 없으면 메서드 실행 후 결과를 캐시에 저장주로 사용되는 상황: 자주 조회되지만 자주 변경되지 않는 데이터@Cacheable(value = "userCache", key = "#userId")public User getUser(String userId) { // select user} 🔄 @CachePut목적: 메서드를 실행하..

back end/java 2025.04.09

Hibernate 성능 튜닝 Tips

1. 개발 과정에서 성능 이슈 찾기Hibernate에는 각 세션별 내부 통계를 확인할 수 있도록 출력해주는 기능이 있습니다. Spring Data JPA를 사용한다면 아래와 같이 설정하면 됩니다. (문제점을 찾을 때만 사용)spring.jpa.properties.hibernate.generate_statistics=truelogging.level.org.hibernate.stat=DEBUG 추가적으로 다음과 같이 설정을 하면 느린 쿼리에 대한 정보를 얻을 수 있습니다.spring.jpa.properties.hibernate.session.events.log.LOG_QUERIES_SLOWER_THAN_MS=10   2. in_clause_parameter_padding 옵션 사용Hibernate 5.2.1..

back end/java 2025.03.10

[JUNIT] Spring Test MockMvc의 한글 깨짐 처리

Spring에서 JUNIT 테스트 코드를 작성할 때 아래와 같이 filter를 추가하면 한글 사용을 할 수 있다.CharacterEncodingFilter("UTF-8", true)  @AutoConfigureMockMvc@SpringBootTestpublic class ApiControllerTest { private MockMvc mockMvc; @Autowired private WebApplicationContext ctx; @BeforeEach public void setup() throws Exception { this.mockMvc = MockMvcBuilders.webAppContextSetup(ctx) .addFilters(new CharacterEncodingFil..

back end/java 2025.03.10

Spring Data JPA에서 Insert 전에 select query를 하는 이유

개요 JPA로 API 서버 개발을 하던 중 insert query에서 매번 select query가 발생하여 엄청난 성능 저하가 발생했습니다. 도대체 왜 이런 것인가? select를 하지 않게 바꿀 수는 없는가? 찾아봤습니다. 현상 확인 1. User 생성 @Entity @Table @Getter @Setter public class User { @Id private String userId; private Integer age; } 2. UserRepository 생성 public interface UserRepository extends JpaRepository { } 3. 테스트 클래스 생성 @SpringBootTest class UserTest { @Autowired private UserRepo..

back end/java 2024.02.02

[java] 문자열 자르기 함수 split 함수 사용 시 주의 사항. 문자열 자르는 방법

결론부터 말하면, 저는 split 함수를 추천하지 않습니다. 그 이유는 split 함수는 문자열을 자를 때 '문자'가 아닌 '정규식'으로 자르기 때문입니다. 이것은 replace 함수도 마찬가지입니다. split 함수 intellij에서 split 함수의 설명을 보면 아래와 같습니다. split 함수의 설명에서 제일 중요한 것은 파란색으로 되어 있는 "regular expression" 즉 정규식입니다. 그렇기 때문에 split 함수는 정말 신중하게 사용해야 합니다. split - 정규식의 위험성 먼저 아래의 예제를 봅시다. 예제 1. 정상동작 public static void main(String[] args) { String str = "010-1111-2222"; String[] split = st..

back end/java 2024.01.17

[JAVA] Google Authenticator(OTP)를 이용한 two factor 개발 방법

개요 2단계 인증 (2FA) 은 사용자가 자신이 누구인지 확인하기 위해 두 가지 인증 요소를 제공하는 보안 프로세스입니다. 2단계 인증은 피해자의 비밀번호만으로는 인증 확인을 통과하기에 충분하지 않기 때문에 공격자가 개인의 장치와 온라인 계정에 접근하는 것을 더 어렵게 만드는 추가 보안 계층을 제공합니다. OTP OTP란 One Time Password의 약자로, 우리말로 하면 일회용 비밀번호라고 할 수 있습니다. 일회성이라는 특징 때문에 매우 안전한 방법으로 알려져 있으며, 금융권이나 일반 웹사이트 2차 인증 방법으로 많이 활용되고 있습니다. OTP의 종류는 원리에 따라 S/KEY방식, 시간 동기화 방식 챌린지 응답 방식, 이벤트 동기화 방식 등이 있습니다. 이 중 Google Authenticator..

back end/java 2024.01.16

[Java] 파일, 폴더(디렉토리) 삭제하는 방법

java에서 별도의 외부 라이브러리를 사용하지 않고 삭제하는 방법은 다음과 같이 두 가지가 있습니다. 1. java.nio.file.Files delete() deleteIfExists() 2. java.io.File detete() 1. java.nio.file.Files - delete() Files.delete() 메소드를 사용하여 파일 또는 디렉터리를 삭제할 수 있습니다. 파일 또는 디렉토리를 삭제하기 위해서는 다음과 같은 사항을 주의해야 합니다. 해당 파일이 존재하는지 확인해야 합니다. 삭제 대상이 없으면, NoSuchFileException이 발생합니다. 삭제하려는 대상이 디렉토리이면, 디렉터리는 비어 있어야 합니다. 디렉터리 안에 파일이 있으면, DirectoryNotEmptyExceptio..

back end/java 2023.11.09

파일 조작의 새로운 길, `java.nio.file.Files` vs `java.io.File`

Java에서 파일 조작에 필요한 API로 오랜 기간동안 사용되어온 java.io.File과 Java 7에서 도입된 java.nio.file.Files는 둘 다 파일 시스템 조작을 위한 도구이지만, java.nio.file.Files가 왜 더 선호되는지에 대해 자세하게 알아보겠습니다. java.io.File의 한계와 문제점 1. Blocking I/O의 한계 java.io.File은 기본적으로 Blocking I/O만을 지원합니다. 이는 파일 작업이 끝날 때까지 스레드가 블록되어 다른 작업을 수행할 수 없다는 의미입니다. 대규모 애플리케이션에서는 효율적인 리소스 활용이 어려울 수 있습니다. 2. 디렉터리 및 파일 조작의 제한 java.io.File은 디렉터리를 다루는 데에 제약이 있습니다. 디렉터리를 조작..

back end/java 2023.11.09

Gson을 사용한 Java 8 LocalDateTime의 직렬화 및 역직렬화

1. 현상 JSON 데이터에는 "2014-03-10T18:46:40.000Z"와 같은 날짜 및 시간 속성이 있으며, 이를 Java 8의 LocalDateTime으로 역직렬화하려고 시도했을 때 다음과 같은 오류가 발생합니다: java.lang.IllegalStateException: Expected BEGIN_OBJECT but was STRING. 2. 원인 이 문제는 Gson이 JSON 문자열을 파싱하고 LocalDateTime 필드에 매핑하려고 시도할 때 발생합니다. Gson은 기본적으로 JSON 문자열을 LocalDateTime으로 변환하지 못하므로 LocalDateTime 필드가 문자열로 처리됩니다. 3. 해결방법 LocalDateTime과 JSON 날짜 문자열 간의 매핑을 처리하기 위해 Gson..

back end/java 2023.11.05
728x90
반응형