Server/Java

    동시성을 해결하기 위한 방법

    온보딩 과제를 진행하던 도중, 동시성에 관한 문제를 직면하고 싶었다. auto increase를 사용하여 추가하는 no와 달리, 마지막 순서를 찾아 해당 순서에서 +1을 진행하는 로직에서는 동시성 문제가 발생하지 않을까?라는 생각에 도달했고, 스레드를 만들어 테스트를 한 결과. Pk였던 no는 1, 2, 3, ... 순서에 맞춰 생성되고 있었지만, orderId는 1, 1, 1, 2, 2, 2, 2, 2,... 순서가 겹쳐지기 시작했다. 접근 목록 트랜잭션 격리 수준 격상 MySQL 락 사용 Synchronized 사용 Redis Lettuce Lock 사용 Redis Redisson Lock 사용 트랜잭션 격리 수준 격상 트랜잭션의 격리 수준을 최상으로 올렸다. SERIALIZABLE을 사용하여 테스트..

    [Java] Javadoc Export 명령어

    [Java] Javadoc Export 명령어

    아무 설정을 하지 않고 export 명령어를 사용하게 되면 인코딩 오류가 발생할 수 있으므로 먼저 build.gradle(java)에 javadoc 인코딩과 관련된 옵션들을 작성하자. javadoc { options.addStringOption("locale","ko_KR"); options.addStringOption("encoding","UTF-8"); options.addStringOption("charset","UTF-8"); options.addStringOption("docencoding","UTF-8"); } 그 후, IntelliJ Terminal에 아래와 같은 명령어를 입력한다. ./gradlew javadoc 그 후 build 폴더를 들어가게 되면 javadoc들이 생겨난 것을 확인할 ..

    [Java] ResponseEntity<> 사용 이유?

    [Java] ResponseEntity<> 사용 이유?

    ResponseEntity? Java Spring의 문서를 보면 ResponseEntity를 다음과 같이 이야기한다. Extension of HttpEntity that adds an HttpStatusCode status code. Used in RestTemplate as well as in @Controller methods. HttpStatusCode 상태 코드를 추가한 HttpEntity의 확장이라고 설명하고 있다. HttpEntity public class HttpEntity { public static final HttpEntity EMPTY = new HttpEntity(); private final HttpHeaders headers; @Nullable private final T bod..

    [Java] Builder 패턴이란? @Builder

    Lombok을 사용하면서 @Builder 어노테이션을 꽤 많이 사용하게 된다. 교육기관에서는 별 다른 이유 없이 "편하니까" 사용하라는 식으로, 별 다른 설명 없이 @Builder를 사용하게끔 종용한다. 개인적으로는 Setter를 비하기 위해 Builder를 사용하자 라는 글을 보고, 정말 특별한 이유가 없다면 최대한 Builder를 사용해서 객체를 생성하게 되었다. 이펙티브 자바에 보면 왜 Builder를 사용해야 하는지 이유를 알려주고 있다. 1. 매개 변수가 많은데 생성자 패턴을..? 필드에 변수가 적다면 생성자를 이용하여 객체를 생성할 수 있다. public class ConstructorEx { public class ConstructorEx { private final String Hello;..

    [Spring] Lombok @AllArgsConstructor, @NoArgsConstructor, @RequiredArgsConstructor

    얼마 전 @Controller, @Service, @Repository등 @Component에 관한 어노테이션에 대한 내용을 정리하고, 심심해서 Lombok 어노테이션인 @AllArgsConstructor, @NoArgsConstructor, @RequiredArgsConstructor은 어떤 차이가 있을까 궁금증이 생겼다. 이런 궁금증이 생기면 안됐다. 손대면 안 되는 것을 손대고 말았다. 각 어노테이션 어노테이션을 보면, 무엇이 다를까. 해당 어노테이션에 맞춰 생성자를 다르게 생성해주고 있었으니, 어떤 로직이 과연 다르게 만들고 있는 걸까? AllArgsConstructor @Target(ElementType.TYPE) @Retention(RetentionPolicy.SOURCE) public @in..

    [JDBC] 데이터베이스 연결

    [JDBC] 데이터베이스 연결

    데이터베이스 연결 ConnectionConst public abstract class ConnectionConst { public static final String URL = "jdbc:h2:tcp://localhost/~/test"; public static final String USERNAME = "sa"; public static final String PASSWORD = ""; } 데이터베이스에 접속하는데 필요한 기본 정보를 작성하는 추상 클래스. 데이터베이스 URL, 데이터베이스 USERNAME, 데이터베이스 PASSWORD를 작성하여 저장하였다. 변경되는 값이 아니므로 상수로 선언. DBConnectionUtil import lombok.extern.slf4j.Slf4j; import ja..

    [JDBC] JDBC와 최신 데이터 접근 기술

    [JDBC] JDBC와 최신 데이터 접근 기술

    JDBC와 최신 데이터 접근 기술 최근에는 JDBC를 직접 사용하기보다는 JDBC를 편리하게 사용하는 다양한 기술이 존재 대표적으로 SQL Mapper와 ORM기술로 나눌 수 있다. JDBC 직접 사용 SQL Mapper SQL Mapper 장점 SQL 응답 결과를 객체로 편리하게 변환 JDBC의 반복 코드 제거 단점 : 개발자가 직접 SQL을 직접 작성해야 함. 대표 기술 : 스프링 JdbcTemplate, MyBatisORM 기술 ORM 기술

    [JDBC] JDBC의 이해

    [JDBC] JDBC의 이해

    JDBC 등장 배경 애플리케이션을 개발할 때 중요한 데이터는 대부분 데이터베이스에 저장하게 된다. 웹, 앱 ---> 애플리케이션 서버 ---> DataBase 커넥션 연결 : 주로 TCP/IP를 사용해서 커넥션을 연결 SQL 전달 : 애플리케이션 서버는 DB가 이해할 수 있는 SQL을 연결된 커넥션을 통해 DB에 전달 결과 응답 : DB는 전달된 SQL을 수행하고 그 결과를 응답. 애플리케이션 서버는 응답 결과를 활용 문제는 각각의 데이터베이스마다 커넥션을 연결하는 방법, SQL을 전달하는 방법, 결과를 응답받는 방법이 모두 다르다는 점! 닮았다는 MySQL과 ORACLE만 봐도 문법이 미세하게 차이난다는 점을 알 수 있다. 여기서 문제가 두 가지 발생한다 다른 종류의 데이터 베이스로 변경할 시 애플리케..