JAVA/Application

우리 서비스에서 일관된 데이터를 불러올 때 쿼리가 나가거나 재계산하는 것이 거슬려서 이번에 스프링 캐시를 도입해봤다. 스프링은 캐시 기능을 제공한다. 스프링 캐시 기능은 트랜잭션처럼 AOP를 통해 구현했기에 어노테이션을 사용하면 된다. 일단 간단히 어노테이션만 추가해뒀다. 현업에서 EhCache, Redis, Memcached를 많이 사용하는 것 같은데 일단은 나중에 공부 및 개선하도록 하고, 이번에는 찍먹해볼 겸 어노테이션을 통한 기본기본 캐시만 해보겠다...일단 평점이랑 메뉴정보만 캐시해뒀다.곧 코드 구조도 리팩터링 예정이라.. 남은 리뷰캐시는 그때 다시 생각해보기로 한다.이제 로그에 잡다한 쿼리문이 안 보여서 좋다. 🪄공부✨ 캐시 저장소두가지 구성방식이 있다. 하나는 JVM ..
계기: 간만에 이펙티브자바 복습했다. 아래 내용을 프로젝트에 적용해보기로 결정했다! https://splendidlolli.tistory.com/672 [이펙티브 자바] null이 아닌, 빈 컬렉션이나 배열을 반환하라 ─ 8장:메서드:Item54 null이 아닌, 빈 컬렉션이나 배열을 반환하라 null이 아닌 빈 배열이나 컬렉션을 반환하라. null을 반환하는 API는 사용하기 어렵고, 오류 처리 코드도 늘어난다. 그렇다고 성능이 좋은 것도 아니다. splendidlolli.tistory.com 🪄 리팩터링 케이스 1. return값을 사용하지 않는데 null 반환을 금지해야 할까? 아래와 같이 리턴값을 사용하지 않는 메서드라도, null을 반환하지 않게 했다. (코드의 일관성, 미래의 안정성을 근거로 ..
🪄 발단카카오 로그인을 구현하면서 클라이언트로부터 token 값을 넘겨받는 api가 많이 생겼다. 현황은 이 token을 검증하지 않고 있었다. 그러나 안전한 서비스를 제공하기 위하여 우리가 가진 jwt secret key로 token을 검증할 필요가 있어보였다. 그래서 오늘 실행에 옮겼다. 사실 지금처럼 검증하지 않더라도 유효하지 않은 token이 넘어올 경우 그냥 개인정보를 제공하지 않도록 처리되어있어서 현재 우리 서비스에 token 검증은 필요하지 않을 수 있다고 생각할 수 있다. 그렇지만, 유효하지 않은 토큰이 넘어올 경우에 대한 관리를 일관된 장소에서 할 수 있다는 장점이 있다고 보았다. 더 나아가, 유효하지 않은 token일 경우에 수행되지 않아도 될 불필요한 비즈니스 로직, 디버깅 비용을 감..
🪄 문제점: ACCESS_KEY와 SECRET_KEY가 컨테이너 환경변수 지정까지는 문제 없이 되어있으나 스프링부트에서 System.getProperty("ACCESS_KEY")로 가져오지 못한다. 🪄 해결: System.getenv()는 JVM이 실행되는 OS의 환경변수를 가져오고, System.getProperty()는 JAVA 시스템 즉 JVM에서 가져오는 것이다. 다시 말해 JVM에 국한되며, 또 다시말해 플랫폼 독립적이다. 즉 이것은 시스템 환경변수를 가져오는 메서드가 아니다. 환경변수가 Java의 시스템 속성으로서 존재하는 경우만 getProperty()로 가져올 수 있다. 그러나 우리 상황에서는 Java의 변수가 아닌 OS의 환경변수를 가져오는 것이기 때문에 System.getenv()를 써..
스프링 캐싱 Intro 웹애플리케이션의 대표적 성능 문제는 RDB에서 대량의 데이터를 자주 가져오는 상황이라고 한다. 그런 상황을 최대한 줄이려고 노력해보자! 잘 변경되지 않는 데이터라면 캐싱해두면 되겠다. 스프링 3.1 이상부터는 데이터 캐시 기능을 제공한다. 즉 캐시의 추상화를 제공한다. 스프링은 Cache & CacheManager 인터페이스를 제공하고 있다. 개발자가 실제 사용할 Cache Provider를 적용할 수 있도록 Service Provider Interface (SPI)를 제공하는 개념이다. 스프링 4.1부터는 어노테이션도 제공한다. (들어가며..) 캐싱 개념은 운영체제 공부할 때 배우기만 했고 이렇게 스프링에서 사용할 수 있다는 생각은 해보지도 않았다. 오늘 일과가 끝나고 지하철에서..
1. 비즈니스 로직 층과 트랜잭션 비즈니스로직과 트랜잭션 처리는 뗄 수 없는 사이다. 그래서 자연스럽게 트랜잭션은 비즈니스로직층에서 처리한다. 그래서 이 글의 목적은, 트랜잭션 처리를 지원하는 스프링 기능을 살펴보기 위함이다. 1.1. 트랜잭션을 처리하는 경계 스프링은 메서드 호출에 대응해서 트랜잭션을 처리한다. 다시말해 트랜잭션은 하나의 요청을 받아내는 비즈니스 메서드 단위로 이루어진다. 그런 메서드는 비즈니스로직층에 구현된다. 그래서 프레젠테이션층과 비즈니스로직층 사이가 트랜잭션의 경계다. 다시 말해서, 컨트롤러가 호출하는 어떤 서비스층의 메서드의 시작이 트랜잭션 시작이다. 그 메서드를 마치고 컨트롤러로 돌아가는 시점이 트랜잭션의 종료다. 그러나 이렇게 경계에서 트랜잭션을 시작하고 종료할 때, 직접 ..
1. 데이터 액세스에 대한 이해 데이터 액세스를 돕는 여러가지 기술이 있다. 자바의 근본 데이터 액세스 기술인 JDBC, 역시 지존인 하이버네이트와 JPA, MyBatis 등의 기술말이다. 먼저 지금은 이러한 기술에 집중하지않고 데이터 액세스 자체에 대한 공통적인 이야기를 하려고 한다. 1.1. 데이터 액세스 층의 필요성 비즈니스로직에 빈번한 데이터액세스처리가 섞여있다면 상상만해도 가독성이 최악이다. 비즈니스 로직을 위한 소스코드에서 핵심 로직을 구분하기 힘들 것이 분명하다. 그래서 데이터 액세스를 담당하는 클래스를 따로 둔다. Data Access Object 약어로 DAO라고 한다. 계좌이체 서비스의 transfer() 기능을 생각해보자. transfer()기능 수행 중 Account 데이터에 접근해..
오류 'dependencies.dependency.version' for org.thymeleaf.extras:thymeleaf-extras-springsecurity5:jar is missing. 또는 Unresolved dependency: 'org.thymeleaf.extras:thymeleaf-extras-springsecurity5:jar:unknown' 또는 org.thymeleaf.extras:thymeleaf-extras-springsecurity5:jar:unknown was not found in https://repo.maven.apache.org/maven2 during a previous attempt. This failure was cached in the local reposi..
🪄 Intro 이 포스팅은 단일 트랜잭션 실습 중 생긴 의문점을 해결한다. 영속성 컨텍스트의 '1차캐시' 개념을 알게 되었다. 🚨 상황 - Spring JPA를 통한 @Transactional 테스트코드 실습중! ↓ 내 테스트코드 Entity의 속성값 "YEEUN KIM"을 "SIKYONG SUNG"으로 변경하는 코드 @Test @Transactional // 영속성 컨텍스트 안에서 관리한다. void UPDATE_TEST() { // Given : 엔티티를 영속성 컨텍스트에 저장 CustomerEntity customer = new CustomerEntity(); customer.setId(1L); customer.setFirstName("YEEUN"); customer.setLastName("KIM"..
학습 키워드 : 자바코드와 쿼리의 분리 &쿼리매퍼인 Mybatis Mybatis를 왜 이용할까? JdbcTemplate 사용시 query가 자바코드에 하드코딩되는 문제가 있다. 이때 쿼리매퍼인 Mybatis를 사용하면, 자바 코드와 쿼리를 분리해준다. 쿼리수정을 위하여 자바코드를 건드는 짓을 하지 않아도 된다는 것이다! Springboot에서 Mybatis를 이용하는 두가지 방법 ■ Annotation을 이용하는 방법 @Insert, @Update @Select annotation의 파라미터로 query를 넣어준다. ■ Xml을 이용하는 방법 xml파일에 query를 작성해주고, 어떤 Mapper와 매핑되는지 명시해준다. 여기서는 xml파일을 이용하는 방법을 기록한다. 먼저 과정을 요약하자면 이렇다. (..
히어로맛쿠키
'JAVA/Application' 카테고리의 글 목록