BackEnd

    [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..

    [MySQL] CSV 파일 import - Boolean, null

    [MySQL] CSV 파일 import - Boolean, null

    CSV 파일을 MySQL 테이블로 import할 때 쿼리문이 아닌 workbench import wizard를 사용하면, boolean과 null 값을 처리하기가 어렵다. null 값 처리 처음에는 null 값을 비워놓았는데 null로 값이 삽입되지 않고 에러가 났다. 그래서 null이라고 데이터를 입력한 후 import하니 성공적으로 DB에 삽입이 되었다. boolean 값 처리 boolean값도 true, false로 삽입하였는데 잘 삽입되지 않아서 true는 1, false는 0으로 삽입하였다. 찾아보니 mysql에서는 boolean값을 0,1로 저장한다고 한다. https://freegians.tistory.com/entry/MySQL-BOOLEAN-TYPE-use-tip MySQL에서 BOOLE..

    [JWT] JWT, Access Token, Refresh Token

    프로젝트를 진행하다 보면 로그인 기능을 구현할 때 JWT를 사용하게 된다. 이전 프로젝트에서는 JWT의 개념을 정확히 이해하지 않고 사용해서 이번 기회에 정리해보고자 한다. 인증 방식의 종류 1. Cookie 인증 방식 웹 사이트의 쿠키에 인증 정보를 저장하는 방식이다. 처음 브라우저가 로그인을 시도할 때, 로그인이 성공하면 서버가 응답 헤더에 로그인 정보를 담는다. 이후 클라이언트는 이 쿠키를 요청 헤더에 포함하여 보내고, 서버는 이 쿠키 정보를 바탕으로 클라이언트를 식별할 수 있다. 단점 쿠키는 브라우저에서 쉽게 확인할 수 있기 때문에 보안에 취약하다. 용량 제한이 있다. 브라우저 간 지원 형태가 다르다. 2. Session 인증 방식 세션은 쿠키와 달리 브라우저가 아니라 서버에 정보를 저장하는 방식..

    [MySQL] csv 파일 Import, Export (MySQL Workbench)

    [MySQL] csv 파일 Import, Export (MySQL Workbench)

    CSV 파일 Import csv 파일을 import 할 table이 있는 스키마의 오른쪽 마우스 버튼을 누르고 table data import Wizard를 클릭한다. import할 csv파일의 경로를 추가한다. 존재하는 table에 import할 것인지, 새로운 테이블을 만들 것인지 선택할 수 있다. source column은 sql 테이블의 column이고, dest column은 csv 파일의 column이다. 이름이 다르다면 올바른 컬럼끼리 연결해준다. next를 누르면 import된 것을 확인할 수 있다. CSV 파일 export https://www.lesstif.com/dbms/mysql-client-query-csv-text-54951965.html MySQL client query 결과를..

    [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 =..

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