분류 전체보기
[Spring 3.1] 트랜잭션과 서비스 추상화
[Spring 3.1] 트랜잭션과 서비스 추상화
2023.04.23스프링은 트랜잭션을 구현할 때 TransactionSynchronizations 방식을 사용한다. Connection 객체를 특별한 저장소에 보관해두고 이후 하나의 트랜잭션 내부에서 호출되는 다른 메서드를 수행할 때는 저장소에 저장된 Connection을 가져가서 사용하는 방식이다. Service에서 Connection을 생성하고 저장소에 Connection을 저장한 후 트랜잭션을 시작한다. 이후 서비스의 메서드를 수행할 때는 저장소에 Connection 객체가 있는지 확인한다. 트랜잭션 내부의 작업이 모두 끝났을 때 커밋을 호출해 트랜잭션을 완료시킨 후 Connection을 제거한다. 작업 스레드마다 독립적으로 Connection을 사용하기에 멀티스레드 환경에서도 충돌이 나지 않는다. JdbcTempl..
[Spring 3.1] 스프링과 예외처리
[Spring 3.1] 스프링과 예외처리
2023.04.20자바에서 예외는 세 가지 종류로 구분된다. 1. Error 클래스 OutOfMemoryError, ThreadDeath 같이 시스템에 비정상적인 상황이 발생한 경우 나타나는 예외이다. 애플리케이션에서는 신경쓰지 않아도 된다. 2. Exception 체크 예외 Exception 클래스의 하위 클래스 중 RuntimeException 클래스를 상속받지 않은 클래스를 의미한다. 3. Exception 언체크 예외 Exception 클래스의 하위 클래스 중 RuntimeException 클래스를 상속받은 클래스를 의미한다. 체크 예외가 발생할 수 있는 메서드에서는 반드시 예외를 처리하는 코드를 추가해야 한다. (컴파일 시점에서 검증된다) 언체크 예외를 처리하는 코드는 강제되지 않는다. 언체크 예외에 대해 알고 ..
[Spring 3.1] 템플릿과 콜백
[Spring 3.1] 템플릿과 콜백
2023.04.19템플릿은 코드 중에서 변하지 않는 부분을 변하는 부분으로부터 독립시켜 효과적으로 활용하는 기법을 말한다. 스프링 프레임워크에 적용된 템플릿 기법을 살펴보고 Data Access Object에 적용해보자. DAO는 데이터베이스와 연결하는 부분이 필수적으로 포함된다. 데이터베이스와의 연결은 Connection Pool을 통해 이루어지고, 커넥션을 모두 사용했다면 반환해 다시 풀에 넣어 줘야 한다. try { // connect.. } catch (Exception e) { } finally { // close.. } 어떤 상황에서도 가져온 리소스를 반환할 수 있도록 try-catch-finally 구문을 사용한다. 제대로 작성한다면 커넥션 풀이 꽉 차는 현상은 막을 수 있지만.. DAO를 작성할 때 마다 t..
[Spring 3.1] 스프링과 테스트
[Spring 3.1] 스프링과 테스트
2023.04.16웹 애플리케이션을 제작하고 제대로 동작하는지 테스트하려면 어떻게 해야 할까? 특정 기능을 테스트하기 위해 해당 테스트와 연계된 서비스, 컨트롤러, 뷰, 웹 서버 환경을 모두 구축해야 테스트 할 수 있다. 여기서 테스트가 실패한다면? 테스트하려는 특정 기능에서 오류가 발생했는지, 아니면 다른 연계된 기능에서 오류가 발생했는지 확인하기 전에 알 수 없다. 즉, 웹 서버를 띄워서 테스트하는 경우 디버깅 비용이 매우 많이 발생한다. 테스트하려는 대상이 명확한 경우 그 대상에만 집중해서 테스트를 진행하는 편이 합리적이다. 이렇게 작은 단위의 코드에 대해 진행하는 테스트를 단위 테스트라고 부른다. 자바는 JUnit 테스트 프레임워크를 제공해 개발자가 단위 테스트를 쉽게 진행할 수 있도록 도와준다. (개발의 전반적인..
[백준] 1114 통나무 자르기 - C++
[백준] 1114 통나무 자르기 - C++
2023.04.14시간 제한은 2초인데, 입력받는 L의 제한이 10억 까지이다. O(L) 시간복잡도로는 해결할 수 없다. 여기서 이분 탐색에 대한 단서를 얻고, 결정 문제로 바꿔서 풀이해야겠다는 전략을 세웠다. 구해야 하는 건 조건을 만족할 때의 가장 긴 조각의 길이와 처음 자르게 되는 위치이다. "가장 긴 조각의 길이" 를 검증 대상으로 설정하고 가장 긴 조각의 길이가 mid일 때 조건을 만족시킬 수 있나? 로 생각하자. 이분 탐색을 위해 입력받는 위치를 우선 정렬해 줘야 한다. (위치가 중복되서 나올 수 있어 중복을 제거하는 것도 괜찮을 것 같다) 현재 자를 수 있는 위치와 다음 자를 수 있는 위치의 차이를 통해 현재 위치와 다음 위치의 길이를 구할 수 있고, 배열에 값을 저장해 검증에서 사용하자. 처음 자르게 되는 ..
[Spring 3.1] 관심사의 분리와 스프링
[Spring 3.1] 관심사의 분리와 스프링
2023.04.13추후 유지 보수를 고려했을 때 관심사 (도메인) 를 작업 단위로 소스코드를 분리해서 작성하는 편이 합리적이다. 이런 측면에서 추상 클래스와 인터페이스는 매우 중요하다. 확장성 있는 애플리케이션을 구현하기 위해 디자인패턴 중 템플릿 메서드 패턴을 사용한다. abstract class Car { public void doorOpen() { } public abstract void drive() { } } class ACar extends Car { public void drive() {...} } 슈퍼 클래스에 기본적인 로직을 만들어 놓고, 일부 기능을 추상 메서드로 만든다. 이후 서브 클래스에서 해당 메서드를 필요에 따라 구현해서 사용하도록 하는 패턴이다. 변화의 성격이 다른 것들을 분리해서 서로 영향을 ..
[Oracle] 관리 문법 정리
[Oracle] 관리 문법 정리
2023.04.05DML Data Manipulation Language의 약자로 데이터 조작 언어로 해석된다. 테이블에 있는 행을 삭제, 수정, 추가할 때 사용된다. insert into tbl (a, b, c) values (1, 2, 3); insert into tbl (a, b) select a, b from tbl2 WHERE c = "asdf" tbl 부분에 테이블, 서브쿼리를 작성하고 데이터를 추가한다. 테이블에 columns를 정의하지 않으면 모든 값을 입력해 줘야 한다. 위의 예시에서 서브쿼리를 사용했는데, c가 asdf인 행을 tb1에 삽입했다. 한 번에 여러 데이터를 삽입할 수 있다. insert ALL into tbl1 (a, b) values (a, b) into tbl2 (a, b) values ..
[Oracle] 중급 문법 정리
[Oracle] 중급 문법 정리
2023.04.03GROUP BY expression select a, b, c from tbl where c > 20 GROUP BY (); GROUP BY 문법을 통해 expression으로 행 그룹을 생성하고 해당 그룹을 하나의 행으로 묶는다. WHERE 조건 뒤에 위치하고, WHERE 절이 실행된 후 실행된다. expression 부분에 b를 넣어주면 b별로 값을 집계한다. 값이 b인 행들을 그룹으로 모아서 결과를 반환하고, 집계 함수와 함께 사용해 그룹들에 대한 통계 값을 얻어올 때 사용한다. 그룹으로 묶는 expression을 여러 개 사용해도 된다. 적절하게 사용해 통계 관련 처리를 편하게 하자. GROUP BY ROLLUP (expression) GROUP BY CUBE (expression) GROUPIN..
[Oracle] 기초 문법 정리
[Oracle] 기초 문법 정리
2023.03.28select distinct column as col from t1.table tbl; select 문법으로 테이블 또는 스키마의 테이블에서 열들을 조회할 수 있다. (schema.table.column 구조를 가진다) distinct, unique 를 함께 사용해 중복된 조회 시 나오는 결과에서 중복된 column을 제거할 수 있고, as 를 사용해 조회하는 열의 별칭을 설정할 수 있다. (예시에서는 테이블에도 별칭을 설정했다) 별칭을 적절히 사용해 쿼리의 가독성을 높이자. select 'literal' as lit, col from table SAMPLE (20); SAMPLE [BLOCK] (sample_percent) [SEED (seed_value)] SAMPLE 문법을 사용해 테이블의 일부 값..
[Docker] Docker Compose
[Docker] Docker Compose
2023.03.24MSA 처럼 여러 가지 서비스들이 모여서 하나의 애플리케이션을 구성하거나, Frontend / Backend / Database 가 모여서 하나의 애플리케이션을 구성하는 경우에 애플리케이션을 도커로 배포하려면 각각의 서비스들을 컨테이너로 띄워야 한다. 각 서비스들을 띄울 때 docker container run 명령어를 하나씩 실행하고 있자니.. 너무 번거롭고 실수할 확률도 높아진다. 이렇게 여러 서비스들이 합쳐저 애플리케이션을 구성하는 형태의 애플리케이션을 도커로 배포할 때 도커 컴포즈를 사용한다. version: '3.7' services: accesslog: image: diamol/ch04-access-log networks: - app-net iotd: image: diamol/ch04-imag..
[Jenkins] Pipeline Script
[Jenkins] Pipeline Script
2023.03.22node { def mvnHome stage('Preparation') { // for display purposes // Get some code from a GitHub repository git 'https://github.com/jglick/simple-maven-project-with-tests.git' // Get the Maven tool. // ** NOTE: This 'M3' Maven tool must be configured // ** in the global configuration. mvnHome = tool 'M3' } stage('Build') { // Run the maven build withEnv(["MVN_HOME=$mvnHome"]) { if (isUnix()) { s..
[Jenkins] CI와 젠킨스
[Jenkins] CI와 젠킨스
2023.03.22기존 소프트웨어 개발 사이클은 위와 같다. 요구 사항 분석 -> 설계 -> 구현 -> 테스트 -> 유지보수 워터폴 모델이라고 불리는 이 사이클은 수십 년 동안 원활하게 작동했지만, 몇 가지 단점이 있다. - 새로운 요구 사항이 자주 발생하는 영역에 적합하지 않다. - 개발이 끝난 후 통합이 진행돼 통합 관련 이슈들이 마지막 단계에서 발견된다 - 각 단계에서 진행 상황을 파악하기 쉽지 않다. 이런 단점을 극복하기 위해 새로운 개발 사이클인 애자일 방법론이 도입됐다. 애플리케이션을 여러 기능으로 분류하고 개발을 진행한다. 계획 -> 요구사항 분석-> 설계 -> 개발 -> 테스트 -> 배포 위의 사이클을 각 기능별로 수행해 기능을 빠르게 구현하고 고객에게 피드백을 받는 구조이다. 요구 사항이 자주 변경되는 프..