전체 글

"As engineers, you don't really understand something unless you can design and implement it."
Spring

[Test] static 블록 vs @BeforeClass

static 초기화 블록 클래스가 JVM에 처음 로드될 때 한번 실행되며, 클래스 레벨에서 공유되는 정적 자원이나 설정 초기화시 사용된다. static 블록 내에서 예외가 발생하면 JUnit과 같은 테스트 프레임워크가 처리하는 것에 어려움이 있다. static 블록의 실행 시점이 명확하지 않다. public class StaticInitializationExample { private static final int SIZE; private static final List NAMES = new ArrayList(); static { SIZE = getIntFromConfigFile("config.txt"); NAMES.add("Alice"); NAMES.add("Bob"); } } @BeforeClass ..

Spring/객체지향

Java와 객체 지향 : OOP 4대 특성

자바와 객체 지향 객체 지향은 인간 지향이다. 절차적/구조적 프로그래밍까지의 과정은 기계 종속적인 개발이었다. 구조적 프로그래밍에서 제일 중요한 것은 함수이다. 복잡한 문제를 작은 문제로 분할하여 정복하는 방법이다. 그러나 몇 천, 몇 만 라인의 명령어를 논리적인 단위로 나누어 블록화하여 작성해야한다. 그 후 객체 지향 프로그래밍이 등장했다. 객체 지향의 출발은 "우리가 주변에서 사물을 인식하는 방식대로 프로그래밍할 수 있지 않겠는가?"라는 물음에서 시작되었다. 0,1로 대변하는 기계(컴퓨터)에 맞춰 사고하던 방식을 버리고 현실세계를 인지하는 방식으로 프로그램을 만들자는 것이다. 그래서 객체 지향은 직관적이다. 객체 지향 이해하기 세상에 존재하는 모든 것은 사물, 즉 객체(Object)이다. 각각의 사물..

Spring/객체지향

프로그래밍의 발전 및 Java와 절차적/구조적 프로그래밍

프로그래밍의 발전 기계어 : 초창기 기술, 0과 1 어셈블리어 : 어셈블러(인간의 언어)로 기계어 생성 - 그러나 기계(cpu)마다 서로 다른 어셈블리어 C : 하나의 소스 파일만 만들면 된다. - 기계별 컴파일러 필요 Java : 하나의 소스 파일, 하나의 컴파일러 - 각 기종 별로 JRE만 설치해주면 된다. Java : Write Once Use Anywhere ! CBD(Componenet Based Development) 컴포넌트 기반 개발 애플리케이션을 의미 있는 단위로 구분하고 그 단위를 하나하나씩 부품으로 개발하여 완성하는 방법 SOA(Service Oriented Architecture) 서비스 지향 구조 개발자 입장에서의 개발이 아니라 실제 현식의 업무를 기준으로 개발 그저 용어일 뿐, ..

CS/데이터베이스

[데이터베이스] 인덱스 + 심화 (커버링 인덱스, 실행 계획, 인덱스 스캔)

인덱스 인덱스란? 인덱스는 데이터베이스 테이블의 하나 이상의 컬럼을 기반으로 생성된다. 인덱스는 컬럼의 값과 레코드 주소를 key - value로 가지고 있는 정보이다. 인덱스를 통해 데이터베이스의 레코드를 빠르게 조회할 수 있다. 인덱스는 빠른 조회를 위해 내부적으로 트리 구조(B-Tree, B+Tree)를 사용하여 키 값을 정렬된 상태로 유지한다. 새로운 레코드가 삽입되거나 기존 레코드가 수정될 경우 인덱스도 그에 맞춰 업데이트되어야한다. 이 과정에서 추가적인 연산이 발생하므로, 이로 인해 레코드의 삽입, 수정, 삭제 성능이 저하될 수 있다. 인덱스 동작 방식 B-Tree 인덱스를 기준으로, 인덱스가 걸린 컬럼이 조건으로 들어왔을 경우를 가정한다. 루트 노드 -> 브랜치 노드(내부 노드) -> 리프 ..

CS/데이터베이스

[데이터베이스] SQL 고급 (내장함수, subquery, 뷰)

내장함수 SQL의 함수는 두가지로 나뉜다. DBMS가 제공하는 내장 함수와 사용자가 필요에 따라 직접 만드는 사용자 정의 함수다. SQL 내장 함수 SQL 내장 함수는 상수나 속성 이름을 입력 값으로 받아 단일 값을 결과로 반환한다. 모든 내장 함수는 최초에 선언될 때 유효한 입력값을 받아야한다. 만약 선언에 위배된 값이 입력되면 질의는 실행을 중지하고 에러 메세지를 출력한다. SQL 내장 함수는 SELECT, WHERE, UPDATE, SET 절 등에 모두 사용 가능하다. 수학 함수 예시 SELECT ROUND(4.875, 1) 답 4.900 문자 함수 날짜 함수 날짜형 데이터로 저장하면 날짜를 더하거나 차이를 구하는 등의 연산을 손쉽게 처리할 수 있다. NULL 값 처리 NULL값이란 아직 지정되지 ..

문제&해결

[Test] 비즈니스 로직 정확도 향상 전략 및 공통 테스트 유틸리티 클래스 활용

문제 문제 상황 @BeforeEach로 테스트 환경을 설정하는 메서드가 비즈니스 로직을 제대로 반영하지 못하는 문제가 발생한다. 예를 들어 회의 생성 로직에서는 단순히 회의 엔티티를 생성하는 것뿐만 아니라, 회의를 생성한 사람도 회의 참가자 리스트에 포함해야 한다. 하지만 이러한 로직이 테스트 환경 설정 메서드에 반영되지 않을 경우 실제 애플리케이션과 다른 상태에서 테스트가 진행되어 에러를 발생시킬 수 있다. 문제 분석 문제 발생 코드 - createTestMeeting @BeforeEach에서 호출되어 테스트 환경을 생성하는 메서드이다. public Long createTestMeeting(Member hostMember) { Meeting meeting = Meeting.builder() .hostM..

문제&해결

Builder 패턴 객체 생성시 필드 초기값 무시되는 문제

문제 상황 Lombok의 @Builder 패턴을 사용하여 Member 클래스의 인스턴스를 생성할때, 특정 필드에 대해 명시적으로 값이 설정되지 않으면 null 값으로 초기화된다. @NoArgsConstructor(access = AccessLevel.PROTECTED) @Getter @Entity @Table(name = "member") @Where(clause = "is_deleted=false") @AttributeOverride(name = "id", column = @Column(name = "member_id")) public class Member extends BaseEntity { @Enumerated(EnumType.STRING) @Column(length = 50, nullable =..

문제&해결

[Test] 데이터 의존성을 줄인 통합테스트 코드 작성 (MockUser, Spring Security)

문제 문제 상황 데이터 의존성 테스트 시 데이터베이스의 데이터 상태에 따라 테스트 통과 여부가 달라진다. 즉, 테스트 결과가 데이터베이스의 테스트 데이터에 의존적이다. Spring Security 보안 컨텍스트 애플리케이션에서 Spring Security를 사용할 경우 테스트시 보안 컨텍스트를 설정하고 jwt 토큰에 넣을 테스트 사용자가 데이터베이스에 존재해야한다. CustomMockUser @Retention(RetentionPolicy.RUNTIME) @WithSecurityContext(factory = WithMockCustomUserSecurityContextFactory.class) public @interface WithMockCustomUser { String username() defau..

mint*
Minty Box