Software Engineering
TDD (테스트 주도 개발)
테스트케이스를 먼저 작성한 이후 실제 코드를 개발하는 기법
자바는 JUnit, C와 C++는 CppUnit라는 자동화 도구로 TDD 테스트케이스를 단위 테스트로 사용할 수 있다.애자일 (Agile)
협력과 피드백을 더 자주하고, 일찍하고, 잘하는 것
개발 과정에 있어서 시스템 변경사항을 유연하게 대응할 수 있는 방법론
애자일을 통한 가장 많이 사용되는 개발 방법론이 스크럼이다.
매일 짧은 스크럼 회의를 하고, 스프린트마다 테스트 제품을 통해 피드백을 받는 방법론이다.OOP (객체지향 프로그래밍) 핵심 개념
객체간 독립성을 보장하고, 중복 코드를 줄이며 유지보수에 도움을 주는 프로그래밍으로, 4개의 특징이 존재한다.
1. 추상화 : 사물들의 공통 특징을 하나의 집합으로 만드는 것
2. 캡슐화 : private 접근자를 통해 낮은 결합도를 유지하는 것
3. 상속 : 자식 클래스를 외부로부터 은닉하는 캡슐화의 일종
4. 다형성 : 부모 클래스의 메소드를 자식 클래스에서 오버라이딩해 유연함을 갖추는 것
SOLID는 OOP 설계원칙MSA (마이크로 서비스 아키텍처)
MSA는 여러 개의 작은 서비스로 구성되어 각 서비스가 독립적으로 개발되고 배포되는 구조
서비스 간 독립성으로 인해 확장성과 유연성이 높아진다.
기능 고립성이라는 특징 때문에 일부 서비스가 실패하더라도 전체 시스템에 큰 영향을 미치지 않는다.
Spring
Bean Scope
Spring Bean은 Spring Framework에서 관리되는 객체들이다.
DI(의존성 주입): Spring은 객체 간의 의존 관계를 설정하고, 이를 주입한다. 개발자는 Spring을 통해 필요한 객체(Bean)를 직접 생성하지 않고도 사용할 수 있다.
Spring 컨테이너에 의해 라이프사이클이 관리되며, 디폴트 Scope는 싱글톤이지만, prototype, request, session등으로 설정 가능하다.MVC Framework
1. 클라이언트가 url로 요청한 request를 Dispatcher Selvlet이 수신
2. Handler Mapping으로 url을 담당하는 Controller 찾는다.
3. Controller가 Model과 View Name을 반환
4. View Resolver에서 View 받아오고, 해당 View에 모델 전달
5. 완성된 View 파일을 클라이언트에 ResponseJPA
자바 ORM 기술의 명세로, 자바 어플리케이션에서 RDB를 사용하는 방식을 정의한 API다.
ORM : 객체지향언어의 객체를 RDB의 테이블와 매핑한다. SQL을 작성하지 않아도 직관적 메소드로 조작할 수 있다. (JAVA ORM 구현체는 Hibernate)
Entity Manager, 영속성 컨텍스트, JPQL로 구성된다.
Entity Manager : DB 구조와 맵핑된 JPA 엔티티들을 관리하는 역할 (CRUD) → 영속성 컨텍스트를 조작하는 인터페이스
영속성 컨텍스트 : Entity Manager가 참조, 스프링에 1개만 존재, 영속화 된 Entity들을 저장하는 환경(DB에 가기전 저장되어 있는 곳) → 엔티티를 메모리(1차 캐시)에 캐시함으로서 DB에 접근할 때 생기는 오버헤드가 줄어듦 + 데이터 일관성 보장 , 1차 캐시는 트랜잭션 내에서만 사용하는 짧은 캐시 레이어 , 글로벌 캐시는 2차 캐시
한 트랜잭션에서 데이터의 변화가 일어나면 dirty check 해두고 커밋될 때 DB에 반영
쿼리들을 모았다가 트랜잭션이 커밋될 때 한번에 반영(flush)함 → 쓰기 지연
스프링에서는 EntityManager가 프록시로 주입되어 있다가 실제로 사용될 때 호출 → 동시성 해결
영속화란 영속성 컨텍스트에 엔티티를 추가하여 해당 엔티티가 DB와 동기화되도록 만드는 과정
최종 JPQL 작동순서
JPQL 작성 →Entity Manager를 통해 실행 → JPA가 SQL로 변환(Hibernate가 구현체이므로 실제론 Hibernate) → SQL이 JDBC를 통해 DB로 전달 → 결과가 JPA로 돌아오고, JPA가 다시 객체로 매핑하여 결과를 반영
Reference
https://mozzi-devlog.tistory.com/34
https://gyoogle.dev/blog/web-knowledge/spring-knowledge/JPA.html