개발을 공부하면서 TDD와 DDD에 대해 정말 많은 이야기를 들어왔고, 많은 회사의 채용 공고에서도 이를 필수 사항으로 여기고 있습니다. 하지만, 주변 개발자들과 대화를 해보면 정작 TDD와 DDD를 왜 써야 하고 이를 통해 얻을 수 있는 게 무엇인지 고민해보지 않고 그저 현재 시장 트렌드를 따르기 위해 무턱대고 적용해보는 경우가 많았습니다. TDD: 테스트 주도 개발 많은 사람들이 TDD의 장점으로 안전한 리팩토링과 버그 감소를 꼽습니다. 하지만, 이는 단순히 테스트 코드를 작성하는 것만으로도 얻을 수 있는 효과입니다. 오히려 TDD의 과정을 처음 접하면 상당히 귀찮고 신경 쓸 부분도 많습니다. 그렇다면 왜 TDD를 사용해야 할까요? 이를 통해 얻는 것이 무엇일까요? TDD는 테스트를 작성하면서 개발..
이전 글에서 진행했던 Syncronized 키워드의 경우 실무에서 적용하기 어렵습니다. 그 이유로는, 1. @Transactional과 Syncronized를 같이 사용할 경우, 동시성을 보장해주지 못합니다. Spring AOP를 적용할때 프록시 객체를 생성하게 됩니다. public void proxy() { EntityTransaction tx = em.getTransaction(); tx.begin(); super.service(); tx.commit();}이런 형태로 Syncronized가 걸린 메서드의 겉을 덮는 프록시가 생성 되기 때문에, Syncronized가 걸린 service() 로직을 실행한후 트랜잭션이 커밋 되기 직전에 다른 스레드에서 servi..
들어가며 만약 스프링 프레임워크를 사용해본 적이 있다면, Dependency Injection (DI)에 대해 들어보셨을 것입니다. 또한, 스프링을 사용하는 대부분의 개발자들은 DI를 빈번하게 사용하고 있을것이라 생각합니다. 저 또한 DI라는 기능을 즐겨 사용해왔지만, 이론적인 부분만 알고 있고 실제로 어떻게 동작하는지에 대해서는 깊게 파고들어보지 않았습니다. 앞서 코드 분석을 진행해왔듯이 이번에도 Spring DI가 어떻게 동작하는지 알아보겠습니다. Application Context 스프링 부트를 사용하여 앱을 실행할 경우 run()을 호출하여 시작하게 됩니다. public ConfigurableApplicationContext run(String... args) { long startTime = ..
들어가며먼저 자바에서 동시성 문제를 해결하기 위한 방법에는 블로킹 방식과 논블로킹 방식 두가지가 존재합니다. 이 글에서는 블로킹 방식의 Syncronized 키워드와 논블로킹 방식의 Atomic 키워드의 성능을 직접 코드를 작성해서 성능의 차이를 확인해 보려 합니다. 이론으로만 Atomic 키워드를 사용하다는 것이 빠르다는 것을 알고 있었기 때문에, 이번 기회를 통해 직접 성능 테스트를 해보며 두 키워드의 성능 차이를 살펴보겠습니다. Syncronized먼저 Syncronized를 썼을때 얼마나 걸리는지 알아 보겠습니다.class CountTest { private static int count = 0; private static AtomicInteger atomicCount = new At..
들어가며 자바 프로그래밍 언어에서 매우 중요하고 널리 사용되는 자료구조 중 하나인 ArrayList의 내부 동작 원리를 깊이 있게 이해하고자, 이 글에서는 ArrayList의 코드를 면밀히 분석하고자 합니다. 우리는 일반적으로 배열의 사용법에 익숙하며, 이로 인해 ArrayList의 복잡한 내부 동작 메커니즘에 대해 깊이 있게 생각해볼 기회가 적었습니다. 이번 기회를 통해 ArrayList가 어떻게 데이터를 저장하고, 접근하며, 관리하는지에 대해 자세히 살펴보며 ArrayList의 효율적인 사용법과 자바 컬렉션 프레임워크의 깊은 이해를 도모할 수 있기를 기대합니다. ArrayList가 구현한 인터페이스 public class ArrayList extends AbstractList implements Li..
DP로 해결 가능한 문제입니다. 웍은 최대 2개만 사용가능하기 떄문에 조합을 사용해서 요리 한번에 나올 수 있는 모든 경우의 수를 구해줍니다. (웍의 개수는 최대 100개 이기 떄문에 모든 조합을 구해도 시간이 크게 걸리진 않습니다.) 이후에는 dp[i] = min(dp[i], dp[i-num]+1) 점화식을 사용해서 1 부터 n 까지 dp를 구해주시면 됩니다. import sys, itertools input = sys.stdin.readline n, m = map(int, input().split()) s = list(map(int, input().split())) s = s + list(map(sum, itertools.combinations(s, 2))) s.sort() INF = 1e9 dp =..
불변객체란불변 객체란, 생성된 후 그 상태를 변경할 수 없는 객체를 의미합니다. 이러한 불변 객체의 대표적인 예로 자바에서는 String과 Integer 등이 있습니다. 참조 변수는 Thread-Safe하지 않다불변 객체는 그 상태가 변하지 않기 때문에 여러 스레드에서 동시에 해당 객체를 참조하더라도 동시성 문제가 발생하지 않을 것처럼 보입니다. 하지만 실제로는 참조하는 변수의 동시성 문제로 인해 예상치 못한 동작을 할 수 있습니다. 예시로 불변객체인 Integer 값을 증가시키려는 시도를 했을때, race condition이 발생하는 것을 알 수 있습니다.public class CountingTest { public static void main(String[] args) { Cou..
멱등성이란?동일한 요청을 한번 보내던 여러번 보내던 같은 결과를 가져야합니다. 따라서, POST, PATCH를 제외한 메서드는 멱등성이 보장되어야한다. POST, PATCH는 왜 멱등성에 포함되지 않을까?POST의 경우, 같은 POST요청을 여러번 진행할 경우 새로운 새로운 자원을 생성하게 됩니다. 그렇기 때문에 매번 서버의 상태가 변경되므로 멱등성에 포함되지 않습니다. PATCH의 경우 의문이 들수 있습니다. PUT의 경우 멱등성을 보장하지만 PATCH는 왜 멱등성을 보장하지 않을까?PUT의 경우에는 여러번 요청되도 똑같이 값을 덮어 쓰기 때문에 서버의 상태가 같습니다.PATCH의 경우, 설계에 따라 멱등성을 보장할 수 도 없을 수도 있습니다. PUT처럼 해당 자원을 덮어쓰게 된다면, 멱등성을..