BackEnd/Spring

    [Spring/JPA] JPA 연관관계에서 지연 로딩과 즉시 로딩

    1. 도입 분명 스프링 강의를 들을 때 제일 집중해서 듣고 이해도 잘 되었던게 연관관계 매핑이었는데, 회사에서 사용하려고 하니 헷갈리는 부분이 너무너무 많았다.. JPA는 잘 사용하면 편리하지만 아무렇게나 쓰면 나도 모르는 쿼리가 많이 발생할 수 있는 것 같다. 팀에서 @Transactional 애노테이션을 모든 곳에 붙이지 않고, 한 트랜잭션으로 묶을 필요가 있는 경우에만 붙이기로 결정해서 쿼리와 서비스 단에서 연관관계에 있는 엔티티들을 어떻게 조회할지 고민이 있었다. 만약 쿼리에서 필요한 엔티티를 모두 조회하지 않고 지연 로딩을 활용한다면, 연관관계에 있는 엔티티가 실제 조회될 때 트랜잭션이 필요했기 때문이다. 그래서 동기랑 이것저것 테스트하면서 정리한 내용을 블로그에도 정리해보려고 한다. Sprin..

    [Spring/JPA] @Version을 통한 낙관적 락(Optimistic Lock)

    낙관적 락 vs 비관적 락 한 자원에 여러 사용자가 접근할 경우 충돌을 방지하거나 데이터의 무결성을 보장하기 위해 동시성 제어가 필요합니다. JPA가 지원하는 동시성 제어 방법으로 낙관적 락, 비관적 락이 있습니다. 낙관적 락(Optimistic Lock) 낙관적 락은 충돌이 발생하는 경우에만 동시성 문제를 해결합니다. 여러 사용자가 동시에 접근하는 것을 허용하며, 충돌이 발생하는 경우에만 락을 통해 해결하는 것입니다. 낙관적 락은 데이터베이스에서 락을 사용하지 않고, 어플리케이션에서 락을 처리함으로써 성능을 개선할 수 있습니다. 비관적 락(Pessimistic Lock) 비관적 락은 충돌을 예방하기 위해 사용자들의 동시 접근을 막습니다. 즉, 동시성을 제한하기 때문에 리소스에 접근하는 사용자가 락을 획..

    [Spring] Kotlin + Spring boot 프로젝트에 Redis 적용

    build.gradle dependencies { ... implementation 'org.springframework.boot:spring-boot-starter-data-redis' } application.yml spring: redis: host: ${REDIS_HOST} port: ${REDIS_PORT} password: ${REDIS_PASSWORD} 비밀번호를 설정하지 않았다면 password는 빼도 된다 EC2에 도커를 활용하여 redis를 설치해서 ec2의 퍼블릭 ip와 설정한 포트번호를 추가하였다. ** docker에서 redis container 실행하기 sudo docker run -p 6379:6379 --name redis -d redis:latest --requirepass..

    [Spring] 스프링 요청 파라미터 - Reqeust Param (required, defaultValue)

    Spring request param @ResponseBody public String requestParamRequired(@RequestParam(required = true) String username, @RequestParam(required = false) Integer age) { log.info("username={}, age={}", username, age); return "ok"; } http://localhost:8080/request-param-required?username=hello → age가 없을 때 파라미터를 int age로 하면 500 에러 → int 형은 primitive type이어서 null값을 가질 수 없음 Integer로 바꿔주면 age는 null이 됨 (아니면..

    [Spring] 로깅 logging

    로깅 로깅 라이브러리 스프링부트 라이브러리를 사용하면 스프링 부트 라이브러리가 함께 포함 (spring-boot-starter-logging) SLF4J: 인터페이스, 구현체-Logback (스프링 부트가 기본으로 제공) 로그 선언 log.trace("trace log={}", name); log.debug("debug log={}", name); log.info("info log={}", name); log.warn("warn log={}", name); log.error("error log={}", name); trace → error로 갈수록 포함 범위가 작아짐 trace: 하위 모든 레벨 포함 error: error만 로그로 출력 log.trace("trace log={}", name); log...

    [Spring] 스프링 MyBatis 연동

    MyBatis 1. pom.xml에 의존성 추가 org.apache.commons commons-dbcp2 2.8.0 mysql mysql-connector-java 8.0.22 org.mybatis mybatis 3.5.6 org.mybatis mybatis-spring 2.0.6 org.springframework spring-jdbc ${org.springframework-version} 2. applicationContext.xml dataSource 빈 등록 driverClassName, url, username, password sqlSessionFactory 등록 dataSource 연결 mapperLocations - mapper.xml의 경로 지정 typeAliasesPackage - d..

    [Spring] 스프링 - File Upload, Download

    파일 업로드 / 다운로드 1. pom.xml에 commons-fileupload 추가 commons-fileupload commons-fileupload 1.4 2. servlet-context에 multipartResolver 추가 defaultEncoding = 인코딩 방식 maxUploadSize= 최대 업로드 크기, -1인 경우 무한 3. form 수정 ... method: POST, enctype=”multipart/form-data”로 설정 이미지 파일만 받고싶은 경우 accept="image/*" 4. ProductController @PostMapping("/product/regist") public String regist(Model model, @RequestPart(required =..

    [Spring] 스프링 인터셉터 - Handler Interceptor

    HandlerInterceptor를 통한 요청 가로채기 Controller가 요청을 처리하기 전/후 처리 실제 Business Logic과 분리되어 처리해야 하는 기능을 넣고 싶을 때 유용하다 @Component public class SessionInterceptor implements HandlerInterceptor { @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { HttpSession session = request.getSession(); // 세션에 로그인 정보가 있다면 그대로 진행 if (session.getAt..

    [Spring] 스프링 핵심 원리 기본편 9. 빈 스코프

    9. 빈 스코프 빈 스코프란? 스프링 빈은 스프링 컨테이너의 시작과 함께 생성되어 스프링 컨테이너가 종료될 때까지 유지 스프링 빈이 싱글톤 스코프로 생성되기 때문 스프링은 다음과 같은 스코프 지원 “싱글톤”: 기본 스코프, 스크링 컨테이너의 시작과 종료까지 유지되는 가장 넓은 범위의 스코프 “프로토타입”: 스프링 컨테이너는 프로토타입 빈의 생성과 의존관계 주입까지만 관여하고 더는 관리하지 않는 매우 짧은 범위의 스코프 “웹 관련 스코프” request: 웹 요청이 들어오고 나갈 때 유지되는 Q스코프 session: 웹 세션이 생성되고 종료될 때까지 유지되는 스코프 application: 웹의 서블릿 컨텍스트와 같은 범위로 유지되는 스코프 프로토타입 스코프 싱글톤 스코프와 달리 스프링 컨테이너에 조회하면 ..

    [Spring] 스프링 핵심 원리 기본편 - 8. 빈 생명주기 콜백

    8. 빈 생명주기 콜백 빈 생명주기 콜백 스프링은 간단하게 다음과 같은 라이프사이클을 가진다 객체 생성 → 의존관계 주입 (생성자 주입은 예외) 초기화 작업은 의존관계 주입이 모두 완료되고 난 다음에 호출해야 함 - 개발자는 의존관계 주입이 완료된 시점을 어떻게 알 수 있을까?? 스프링은 의존관계 주입이 완료되면 스프링 빈에게 콜백 메서드를 통해 초기화 시점을 알려주는 다양한 기능을 제공 스프링은 스프링 컨테이너가 종료되기 직전에 소멸 콜백을 준다 스프링 빈의 이벤트 라이프 사이클 스프링 컨테이너 생성 → 스프링 빈 생성 → 의존관계 주입 → 초기화 콜백 → 사용 → 소멸 전 콜백 → 스프링 종료 초기화 콜백: 빈이 생성되고 빈의 의존관계 주입이 완료된 후 호출 소멸전 콜백: 빈이 소멸되기 직전에 호출 ..

출처: https://gmnam.tistory.com/157 [Voyager:티스토리]