Backend
트랜잭션은 작업에서 예외가 발생할 경우 Rollback 처리를, 모두 성공할 경우 Commit 처리하는 실행 단위이다.Spring에서는 트랜잭션과 관련된 기술들을 제공하며, 주로 @Transactional 어노테이션을 통해 쉽게 사용할 수 있다.이번 포스팅에서는 Transacrtional을 Spring의 트랜잭션의 동작 특성과, 트랜잭션 전파라는 키워드를 위주로 살펴보려고 한다. Spring이 제공하는 트랜잭션 기능 1. 트랜잭션 동기화데이터베이스와의 작업이 트랜잭션 컨텍스트 내에서 일관되게 처리될 수 있도록 도와준다. 이는 여러 데이터베이스 작업이 하나의 트랜잭션 안에서 수행되도록 동기화하는 것을 의미한다. 예를 들어, 하나의 서비스 메서드에서 두 개의 다른 데이터베이스 테이블을 업데이트해야 한다고 ..
우리는 흔히 Controller, Service, Repository 등의 계층별 모듈로 구분하여 프로그램을 작성한다.이번 포스팅에서는 Layer 별 테스트 코드를 어떻게 작성하면 좋을지에 대한 전략에 대해서 작성해보려고 한다. 해당 포스팅의 내용은 무조건 계층별로 테스트 코드는 이렇게 작성해야 한다는 것이 아닌, 그저 테스트 코드를 작성하는 수만가지 전략 중 하나라는 것을 엄두하고 구경하면 좋을 것 같다. 기본사항 프로파일 분리application.yml의 프로파일을 Test 전용으로 나누어 독립적인 DB를 사용할 수 있게 하자.테스트 시 실제 환경(DB)에 영향을 주지 않고 데이터베이스를 초기화하거나 필요한 데이터를 주입하여 테스트할 수 있도록 하기 위해서이다.spring: profiles: ..
레이어드 아키텍쳐 (3-tier Layered Architecture) 우리는 흔히 Spring Framework를 이용하여 Controller, Service, Repository 등의 계층별 모듈로 구분하여 프로그램을 작성하였다. 해당 구조를 3-tier Layered 아키텍쳐라고 한다.해당 구조는 각 계층이 서로 독립적으로 동작하고 각 계층의 역할을 명확하게 구분하여 유지보수성과 확장성을 높이는 것을 목표로 한다. 이번 포스팅에서는 프로그램을 작성할 때, 계층별로 집중해야 하는 포인트에 대해서 알아보려고 한다. Presentation Layer 사용자와 애플리케이션 간의 인터페이스 역할을 담당하는 계층이다. 사용자의 요청을 수신하고, 이를 비즈니스 로직으로 전달하며, 결과를 사용자에게 반..
테스트 코드의 필요성 수동 테스트의 문제점 수동으로 테스트 한다는 것은 곧 사람이 직접 테스트를 수행한다는 것이다. 특정한 케이스를 직접 넣어보고, 출력이나 로그 따위를 살펴보거나 디버깅을 해보는 행위, 우리가 늘상 해오던 과정이다. 그러나 사람이란 누구든 실수를 하며, 편협된 시각을 가지고 있다. 이로 인해 커버하지 못하는 영역이 있을 수 있으며, 이는 늦은 피드백, 유지보수의 난이도 상승, 소프트웨어 신뢰성 하락으로 이어진다. 테스트 코드의 필요성 테스트 코드의 정체성은 "빠른 피드백", "자동화", "안정성", "공유"로 압축할 수 있다. 빠른 피드백 : 개발자는 Production Code(실제 코드)와 Test Code 사이의 피드백을 통해 품질을 개선해 나갈 수 있다. 개발자가 코드를 작성하고..
이전 포스팅에서 @SpringBootTest를 사용해서 통합 테스트를 작성하는 방식에 대해서 알아보았다.이번 포스팅에서는 테스트 코드에서의 모듈 의존성 격리의 필요성과, 어떤 경우에 대해 적용되어야 하는지 알아보도록 하겠다. https://sjh9708.tistory.com/195 [Spring Boot] 테스트 코드 : 시작하기 (JUnit)테스트 코드의 필요성 및 실천 방법론 테스트 코드의 필요성과 "좋은 테스트 코드"를 작성하기 위한 방법론에 대해서 작성한 내용이다. 테스트 코드를 "왜" 작성하고 "어떠한 마음가짐"으로 임sjh9708.tistory.com 테스트를 작성할 예시 Service 필자는 아래의 서비스에 대한 테스트 코드를 작성해 보면서 앞으로의 내용을 설명하려고 한다.@Service@..
Scanner Scanner는 사용자로부터의 입력을 읽기 위한 클래스이며. 주로 키보드 입력을 읽거나 파일에서 데이터를 읽을 때 사용된다. 코딩 테스트를 비롯한 PS 문제에서 BufferedReader와 함께 입력을 받기 위해서 많이 사용된다. Scanner은 BufferedReader에 비해서 사용하기 용이한 메서드들을 클래스에서 많이 제공한다. 따라서 BufferedReader에 비해서 자료형을 처리하거나 간단하게 입력을 처리하기에 용이하다. 그렇지만 데이터를 파싱하기 위해서 내부적으로 정규 표현식 등을 사용하여 BufferedReader에 비해 내부적으로 복잡한 과정을 거쳐 처리 시간이 더 오래 걸린다. 따라서 입력량이 고정되어 있고, 그 양이 많지 않은 경우에는 Scanner를 사용하여 편리하게 ..
정렬 Java에서 배열과 컬렉션과 같은 데이터의 집합을 정렬하는 방법들에 대해서 살펴보겠다. 기본적인 정렬 방법부터, Comparator과 Comparable의 개념과, 둘의 사용 목적에 대해서 살펴보려고 한다. 추가적으로 Java에서 사용되는 정렬 알고리즘에 대해서 알아보자. 배열 : 기본 정렬 방법 int[] array = {5, 2, 8, 1, 9}; // 배열 오름차순 정렬 Arrays.sort(array); System.out.println(Arrays.toString(array)); // [1, 2, 5, 8, 9] 기본적으로 정렬 시, Arrays.sort(data) 메서드를 이용한다. 이는 따로 리턴 타입이 있지 않고, 메서드 내부에서 집합을 정렬하여 재배치하게 되기 때문에 array 변수..
Collection Framework(컬렉션 프레임워크) 자바에서는 데이터를 저장하고 관리할 수 있는 다양한 방법을 제공한다. 컬렉션 프레임워크는 자료를 구조화하여 데이터를 쉽게 사용할 수 있도록 도와준다. 계층 구조로 살펴보는 Collection의 종류 Collection : 대부분의 컬렉션 클래스의 상위 인터페이스. 컬렉션의 기본 동작을 정의한다. Set : 중복된 요소를 허용하지 않는 컬렉션 인터페이스. 구현체로는 HashSet,, TreeSet 등 List : 순서가 있는 요소들의 컬렉션 인터페이스. 인덱스에 의해 접근이 가능하다. 구현체로는 ArrayList, LinkedList, Vector(Extend -> Stack) 등 Queue : FIFO를 따르는 컬렉션 인터페이스. 구현체로는 Lin..
Java에서는 문자열을 다룰 수 있는 다양한 메서드 및 기능들을 제공한다. 해당 기능들은 프로그래밍에서도 유용하게 사용할 수 있으며, 문자열을 다루는 것은 코딩 테스트를 비롯한 PS에서 빈출 문제이다. 문자열의 다양한 메서드들 1. 문자열 탐색 및 추출 String str = "Hello, world!"; char ch = str.charAt(1); // 'e' int length = str.length(); // 13 String substr1 = str.substring(7); // "world!" String substr2 = str.substring(7, 12); // "world" int index1 = str.indexOf(","); // 5 int index2 = str.lastIndexOf..