본문 바로가기

전체 글

싱글톤 컨테이너 앱 애플리케이션과 싱글톤 앱 애플리케이션은 보통 여러 고객이 동시에 요청을 한다. 스프링 없는 순수한 DI 컨테이너 테스트 // SingletonTest.java package ghdtjgus76.core.singleton; import ghdtjgus76.core.AppConfig; import ghdtjgus76.core.member.MemberService; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; import static org.assertj.core.api.AssertionsForClassTypes.assertThat; public class SingletonTest { @Test @DisplayNa.. 더보기
스프링 컨테이너와 스프링 빈 스프링 컨테이너 생성 ApplicationContext applicationContext = new AnnotationConfigApplicationContext(AppConfig.class); 여기서 ApplicationContext를 스프링 컨테이너라고 한다. ApplicationContext는 인터페이스이다. 그리고 스프링 컨테이너는 XML 기반으로 생성할 수도 있고, 애노테이션 기반 자바 설정 클래스로 만들 수도 있다. 위 방식은 애노테이션 기반 자바 설정 클래스로 스프링 컨테이너를 만든 것이다. 스프링 컨테이너 생성 과정 1. 스프링 컨테이너 생성 스프링 컨테이너 생성 시 구성 정보를 지정해주어야 하는데, 여기서는 AppConfig.class로 지정했다. 2. 스프링 빈 등록 스프링 컨테이너는 .. 더보기
스프링 예제-2 새로운 할인 정책 개발 // RateDiscountPolicy.java package ghdtjgus76.core.discount; import ghdtjgus76.core.member.Grade; import ghdtjgus76.core.member.Member; public class RateDiscountPolicy implements DiscountPolicy { private int discountPercent = 10; @Override public int discount(Member member, int price) { if (member.getGrade() === Grade.VIP) { return price * discountPercent / 100; } else { return 0; }.. 더보기
스프링 예제-1 비즈니스 요구사항과 설계 회원 회원 가입 및 조회 가능 회원은 일반과 VIP로 나뉜다. 회원 데이터는 자체 DB를 구축할 수 있고, 외부 시스템과 연동할 수 있다. 주문과 할인 정책 회원은 상품을 주문할 수 있다. 회원 등급에 따라 할인 정책을 적용할 수 있다. 모든 VIP의 경우 1000원을 할인해주는 고정 금액 할인을 적용한다. 할인 정책은 변경 가능성이 높다. 회사의 기본 할인 정책은 미확정이다. 아직 미확정인 회원 데이터와 할인 정책은 인터페이스로 만들고 상황에 따라 구현체를 갈아끼우는 방식으로 설계하면 된다. 회원 도메인 설계 회원 도메인 협력 관계 회원 클래스 다이어그램 회원 객체 다이어그램 회원 도메인 개발 // Grade.java package ghdtjgus76.core.member; p.. 더보기
객체 지향 설계와 스프링 역할과 구현을 분리하자. 역할과 구현을 분리해서 생각해보자. 예를 들어서 운전자 - 자동차 관계가 있을 때, 운전자는 자동차의 내부 구조를 몰라도 운전하는데 아무 지장이 없다. 만약, 운전자가 테슬라를 몰다가 아반떼로 차를 바꿨다고 해도 전혀 문제가 되지 않는다. 이는 역할과 구현을 분리해서 생각했기 때문에 가능한 것이다. 운전자는 클라이언트고, 자동차는 역할, 테슬라나 아반떼는 구현체 정도로 생각하면 된다. 역할과 구현으로 분리해서 생각하면 대체 가능성이 생긴다. 따라서 변경이 용이하고 유연해져서 확장 가능성이 생기는 것이다. 자바 언어와 이를 연결시켜보자. - 역할 = 인터페이스 - 구현 = 인터페이스를 구현한 클래스, 구현 객체 객체를 설계할 때 역할과 구현을 명확히 분리하고, 역할을 먼저 부여한 .. 더보기
Next.js를 배워보자-4 NextJS 앱 최적화하기 각 페이지에 메타데이터와 ); }; export async function getStaticProps(context) { const featuredEvents = await getFeaturedEvents(); return { props: { events: featuredEvents, }, }; } export default HomePage; 모든 페이지들에 공통적으로 위 데이터를 넣고 싶다면 _app.js 파일에서 처리해주면 된다. 만약 _app.js와 특정 페이지에 둘 다 설정해주었다면 Next.js는 알아서 둘을 병합해서 나타낸다. _app.js 파일 말고도 pages > _document.js 파일에 다음과 같이 작성해볼 수도 있다. import Document, { H.. 더보기
Next.js를 배워보자-3 페이지 사전 렌더링 & 데이터 페칭 표준 React라면 빈 HTML 파일과 모든 js 코드가 표시될 것이다. 그리고 js 코드가 실행되면 내용이 표시될 것이다. 이때 서버로부터 데이터를 불러오는 경우 시간이 소요될 수도 있다. 이는 React는 사전 렌더링된 페이지를 반환하지 않기 때문이다. 사용자가 페이지를 방문하면 Next.js는 사전 렌더링된 페이지를 반환한다. 사전에 HTML 페이지를 완성해놓고 완전히 채워진 HTML 파일을 클라이언트에게 전송하게 된다. 그래서 SEO 관점에서 좋다는 것이다. 또한, Next.js는 포함된 js 코드를 모두 재전송하는데 이를 hydrate라고 한다. 이 코드들은 나중에 사전 렌더링된 페이지를 대체하고 React는 그에 알맞은 작업을 한다. 사전 렌더링은 오직 최초.. 더보기
Next.js를 배워보자-2 페이지 & 파일 기반 라우팅 React 앱 상에서는 라우팅을 사용하기 위해서는 라우트에 관련된 다양한 컴포넌트를 react-router-dom으로부터 추가한다. 하지만 Next.js는 React 라우터를 설치하지 않고, 라우트나 페이지 구조를 정의하는 데에 JSX나 js 코드를 전혀 사용하지 않는다. Next.js에서는 React 컴포넌트 파일을 생성한다. 이후, 설정된 폴더 구조로부터 프로젝트의 라우트를 도출해 내도록 만든다. Next.js는 pages 폴더를 자동으로 확인해서 라우트 구조를 도출해 낸다. pages 내부 폴더 구조가 다음과 같다고 해보자. pages │ about.js => my-domain.com/about │ index.js => my-domain.com/ │ └─products .. 더보기