소프트웨어 아키텍처 패턴의 하나 애플리케이션을 세 개의 주요 계층으로 분리하는 방식 이를 통해 시스템의 모듈성을 높이고 유지 보수를 용이하게 하며, 성능과 확장성을 향상시킬 수 있다. 프리젠테이션 계층 (Presentation Tier)사용자와 상호 작용하는 부분으로, 사용자 인터페이스(UI)를 제공한다.HTML, CSS, JavaScript 등으로 UI를 구성하며, 사용자로부터 입력을 받고 이를 처리하여 데이터를 표시한다.애플리케이션 계층 (Application Tier)비즈니스 로직을 처리하는 부분으로, 데이터 처리, 계산, 데이터 변환 등의 핵심 기능을 담당한다.프리젠테이션 계층과 데이터 계층 간의 중개 역할을 하며, 두 계층 간의 데이터 흐름을 관리한다.일반적으로 서버에서 실행되며, Java, ..
특정 수로 나누어 나머지 구하는 과정을 다른 방식으로 해주었더니 시간 초과를 해결하였다. def solution(n): answer = 0 dp = [0] * (n+1) if n == 1: return 1 if n == 2: return 2 dp[1] = 1 dp[2] = 2 for i in range(3, n+1): dp[i] = dp[i-1] + dp[i-2] return dp[n] % 1000000007 위 코드는 일부 효율성 테스트케이스에서 시간 초과가 발생하였다. 위 코드는 1000000007 로 나누는 과정을 마지막에만 해주었다.def solution(n): ..
IoC(제어의 역전) 제어의 역전은 다른 객체를 직접 생성하거나 제어하는 것이 아니라 외부에서 관리하는 객체를 가져와 사용하는 것을 말한다. 즉, 객체의 생성과 관리를 개발자가 하는 것이 아닌 프레임워크가 대신한다. [클래스 A에서 new 키워드로 클래스 B의 객체 생성] public class A { b = new B(); } [코드에서 객체를 생성하지 않음, 어디선가 받아온 객체를 b에 할당] public class A { private B b; } 다른 곳에서 받아와서 사용한다. 직접 생성하는 것이 아니다. 외부의 객체를 관리하는 주체를 스프링 컨테이너라고 한다. DI(의존성 주입) DI는 어떤 클래스가 다른 클래스에 의존한다는 말이다. public class A { @Autowired B b; }..
서버리스 컴퓨팅 서비스 서버리스는 사용자가 관리할 서버가 없다는 것이다. 단순히 서버가 없다고 착각하면 안된다. Lambda는 장점이 많다. 비용 : 코드가 실행될 때만 요금이 발생한다. 보안 : 시스템적인 것은 AWS에서 관리하므로 사용자는 Lambda로 사용할 코드만 관리하면 된다. 가용성 : 복수의 가용 영역(AZ)에서 실행된다. 사용자가 설정하지 않아도 고가용성, 장애 대응성이 유지된다. 확장성 : 동시에 다수의 처리를 해야 하는 경우 AWS가 관리하는 처리용 인스턴스가 시작되면서 확장된다. "사용한 컴퓨팅 시간에 대해서만 요금을 지불하면 되고 코드가 실행되지 않을 때는 요금이 부과되지 않습니다. Lambda를 사용하여 사실상 모든 유형의 애플리케이션 또는 백엔드 서비스의 코드를 실행할 수 있고 ..
서버 템플릿 엔진 JSP, Freemarker, Velocity는 한동안 업데이트가 안되고 있다. Springboot는 위 같은 엔진을 권장하지 않고, Thymeleaf를 권장하고 있다. 하지만 Handlebars를 사용해보는 것도 좋다. 이의 장점은 문법이 다른 템플릿 엔진보다 간단하고, 로직 코드를 사용할 수 없어 View 역할과 서버의 역할을 명확하게 분리할 수 있다. 템플릿 엔진은 일반적으로 비즈니스 로직과 연관되지 않는 것이 좋다. build.gradle 의존성 추가 implementation 'pl.allegro.tech.boot:handlebars-spring-boot-starter:0.3.4'
https://www.testcontainers.org/ TestContainers는 Junit Test를 지원하는 Java Library로, Docker 컨테이너를 사용할 수 있도록 일회용 인스턴스를 제공한다. 일회용이니 독립적이고 멱등성있는 환경을 얻을 수 있다. 장점 - 테스트할 때만 컨테이너를 띄우기 때문에 계속해서 메모리를 차지하지 않는다. - 테스트 환경 DB가 필요없기 때문에 추가 리소스가 필요하지 않다. 단점 - 테스트를 실행할 때마다 도커 컨테이너를 생성하고 세팅하는 작업이 추가된다. - 가벼운 테스트라도 도커 컨테이너를 생성하고 세팅하는 시간이 있어 시간이 소요된다. build.gradle 의존성 추가 testImplementation 'org.testcontainers:spock:1...
도커 컨테이너를 사용하여 응용프로그램을 더 쉽게 만들고, 배포하고 실행할 수 있도록 설계된 도구이며 컨테이너 기반의 오픈소스 가상화 플랫폼 어플리케이션 환경에 구애받지 않고 손쉽게 배포 관리가 가능하다. 컨테이너 기반 배포 방식은 구글을 비롯해 대부분 서비스 회사가 컨테이너로 서비스 운영 중 컨테이너는 도커 이미지를 독립적인 공간에서 실행할 수 있게 해주는 기술이다. 도커는 왜 사용할까? 똑같은 일을 하는 서버가 2대가 있다고 하자. A서버는 1년 전에 구성했고 B서버는 방금 구성했다. 그럼 운영체제, 컴파일러 등의 조건이 같지가 않을 가능성이 높다. 도커는 서버마다 동일한 환경을 구성해주기 때문에 이러한 문제를 해결할 수 있다. 또, auto scaling에 유리하다. auto scaling ? 서버 ..
HashMap, HashTable, ConcurrentHashMap 차이 모두 Map 인터페이스의 구현체 HashMap - key와 value에 null을 허용한다. - 동기화를 보장하지 않는다. - thread-safe하지 않아 싱글 스레드 환경에서 사용하는 것이 좋다. - 속도는 빠르지만, 신뢰성과 안정성이 떨어진다. HashTable - key와 value에 null을 허용하지 않는다. - 동기화를 보장한다. - thread-safe하기 때문에, 멀티 스레드 환경에서 사용할 수 있다. - 데이터 무결성을 보장한다. ConcurrentHashMap - key와 value에 null을 허용하지 않는다. - 동기화를 보장한다. - thread-safe하기 때문에, 멀티 스레드 환경에서 사용할 수 있다. ..