왜 지름길은 깨진 창문과 같을까?깨진 창문 이론어떤 것이 멈춘 것처럼 보이고, 망가져 보이고, 관리되지 않는다고 여겨지면 인간의 뇌는 이를 더 멈추고, 망가뜨리고, 관리하지 안 해도 된다고 생각하게 된다. (Philp Zimbardo)망가진 자동차와 안 망가진 자동차를 주차해두고 실험해 본 결과 사람들은 망가져 있는 자동차를 더 망가트리거나 부품들을 도난했다. 반대로 안 망가진 자동차를 그대로 유지가 되는 결과가 있었다. 하지만, 안 망가진 자동차의 창문을 깨트리고 다시 실험을 했을 때, 바로 망가져버리는 결과가 있었습니다. → 이러한 실험 결과를 통해 알 수 있는 점은 사람은 심리적으로 망가져 있는 것을 보면 아닌 것에 비해 더 막 다루어도 된다고 생각하는 경향이 있다. 코드 작업과 깨진 창문과의 관계..
유스케이스 역할 살펴보기입력을 받는다.비즈니스 규칙을 검증한다.모델 상태를 조작한다.출력을 반환한다.유스케이스는 인커밍 어댑터로부터 입력을 받습니다.이 단계는 “입력 유효성 검증”을 하는 것이 아니라, Controller에서 받은 입력값을 유스케이스 서비스에 맞게 매핑하여 전달합니다. (SendMoneyRequest → SendMoneyCommand) 유스케이스는 비즈니스 규칙을 검증할 책임이 있으며, 비즈니스 규칙을 충족하면 유스케이스는 입력을 기반으로 모델의 상태를 변형합니다.일반적으로 도메인 객체의 상태를 바꾸고, 영속성 어댑터를 통해 구현된 포트로 이 상태를 전달하여 데이터베이스의 값을 변경하거나 저장합니다. (하나의 유스케이스는 여러 개의 아웃고잉 어댑터를 호출할 수 있습니다.)아웃고인 어댑터에..
스프링 부트를 기반으로 테스트 코드 작성 시 자주 등장하는 테스트 어노테이션의 사용 상황과 기능에 대해 정리하고자 합니다. @SpringBootTest 어노테이션Annotation that can be specified on a test class that runs Spring Boot Based tests. @SpringBootTest 어노테이션은 스프링 부트 기반 테스트 시에 사용하는 어노테이션이다. 다음과 같은 기능과 특징을 가지고 있습니다. 1. Uses SpringBootContextLoader as the default ContextLoader when no specific @ContextConfiguration(loader=...) is defined. 💬 특정 @ContextConfigu..
Spot Instance란Spot Instance는 on-demand 가격보다 저렴한 비용으로 제공되는 예비 EC2 용량을 사용할 수 있는 인스턴스입니다. Spot Instance는 큰 할인율로 미사용 EC2 인스턴스를 요청할 수 있게 해주어 보다 값싼 가격으로 EC2를 사용할 수 있습니다. spot instance의 시간당 가격을 spot price라고 합니다. 각 가용 영역 내 인스턴스 유형별 스팟 가격은 Amazon EC2에서 설정하며, 스팟 인스턴스의 장기적 공급 및 수요에 따라 점진적으로 조정됩니다. 용량을 사용할 수 있을 때마다 스팟 인스턴스가 실행됩니다. 용량을 사용할 수 있을 때에만 spot instance를 사용할 수 있으므로, 데이터 분석, 배치 작업, 백그라운드 프로세싱 및 선택적 작..
@PostConstructSpring calls the methods annotated with @PostConstruct only once, just after the initialization of bean properties. 스프링은 @PostConstruct가 붙은 메서드를 빈 속성 초기화 이후에 단 한 번 호출합니다. The method annotated with @PostConstruct can have any access level, but it can’t be static. @PostConstruct가 붙은 메서드는 static으로 선언될 수 없습니다.초기화 작업을 하므로, 정적 메서드로 선언될 수 없다.@Componentpublic class DbInit { @Autowired ..
String 문자열 더하기String str = "A" + "B" + "C" + "D";String str = String("A") + String("B") + String("C") + String("D");String str = new String("AB") + String("C") + String("D");String str = new String("ABC") + String("D");String str = new String("ABCD"); 최종적으로는 new String(”ABCD”)만 사용되는데, 중간에 생성되는 Garbage Class가 생성되는 문제가 있습니다. 문자를 자주 더하거나 변경해야 하는 상황이라면 더 많은 String 객체를 만들고, GC 해야 합니다.→ 컴퓨터의 CPU, 메모리 ..
Annotation자바 어노테이션은 MeteData를 소스 코드(class, method, field)에 붙여 Marker interface 역할을 하여, 특정 동작을 표시하는 데 사용합니다. Marker Interface란Marker Interface는 구현 클래스에 특별한 동작을 부여하거나 특정 속성을 나타내기 위해 아무 메서드도 포함하지 않는 인터페이스입니다.public interface Marker { // 아무 메서드도 정의하지 않음} 어노테이션 주의 사항@interface로 정의해야 합니다.모든 어노테이션은 기본적으로 java.lang.Annotation 인터페이스를 상속하기 때문에 다른 클래스나 인터페이스를 상속할 수 없다.Parameter 멤버들의 접근자는 public or defau..
계층형 아키텍처 구조 - web, domain, persistence 로 나누기최적화된 구조가 아닌 이유애플리케이션의 기능 조각이나 특성을 구분 짓는 패키지 경계가 없다.web 패키지에 UserController 추가, domain 패키지에 UserService, UserRepository, User 추가, persistence 패키지에 UserRepositoryImpl을 추가하게 되어 세부 기능과 역할별로 구분하기 어렵다.애플리케이션이 어떤 유스케이스들을 제공하는지 파악할 수 없다.AccountService, AccountController 처럼 작성하게 되면 어떤 유스케이스를 구현했는지 파악하기 어렵다.특정 기능을 찾기 위해서 어떤 서비스가 이를 구현했는지를 추측해야 하고, 해당 서비스 내의 어떤 메..