8.2) 스프링의 목적
엔터프라이즈 개발의 복잡함
- 전통적인 자바 엔터프라이즈 개발 기법 프로젝트는 여러 가지 원인으로 실패했었지만,
그중 가장 대표적인 이유는 엔터프라이즈 시스템 개발이 너무 복잡해져였다.- 엔터프라이즈 시스템이란 서버에서 동작하며 기업과 조직의 업무를 처리해주는 시스템을 말한다.
- 엔터프라이즈 시스템은 많은 사용자의 요청을 동시에 처리해야 하기 때문에
서버의 자원을 효율적으로 공유하고 분배해서 사용할 수 있어야 하며 보안과 안정성, 확장성 면에서도 뛰어나야 한다.
따라서 뛰어난 성능과 서비스의 안정성이 요구되고 그런 점을 고려한 개발 기술이 필요하다. - 즉, 엔터프라이즈 시스템을 개발하는데는
순수한 비즈니스 로직을 구현하는 것 외에도 기술적으로 고려할 사항이 많다는 뜻이다. - 따라서 이런 종류의 기술적인 문제를 고려하면서 애플리케이션을 개발해야 하는 부담을 안게 된다.
- 엔터프라이즈 시스템이란 서버에서 동작하며 기업과 조직의 업무를 처리해주는 시스템을 말한다.
- 엔터프라이즈 시스템이 기업 업무를 처리하는데 핵심적인 역할로 등장하고 중요해지면서
점점 더 기술적인 요구는 심화되고 그에 따른 복잡도는 증가한다.- 경제 흐름과 사회의 변화, 업계의 추이에 따라 수시로 업무 프로세스를 변경하고
애플리케이션을 자주 수정해줘야 하는 시대가 되었으므로
이전과 다르게 시스템 개발과 유지보수, 추가 개발 등의 작업에 대한 부담은 커지고
그에 따른 개발의 난이도도 더욱 증가한다. - 자바 엔터프라이즈 시스템 개발이 어려운 가장 큰 이유는 이처럼 근본적인 비즈니스 로직과
엔터프라이즈 기술이라는 두 가지 복잡함이 한데 얽혀 있기 때문이다. - 두 가지를 한 번에 다뤄야 하니 복잡함은 몇 배로 가중된다.
- 경제 흐름과 사회의 변화, 업계의 추이에 따라 수시로 업무 프로세스를 변경하고
복잡함을 해결하려는 도전
- 기술적인 복잡함을 해결하고자 보안을 취약하게 방치한다거나,
사용자가 늘어나도 더 이상 확장이 불가능한 시스템을 만들 수는 없다.- 결국 근본적으로 엔터프라이즈 개발에 나타나는 복잡함의 원인은 제거 대상이 아니므로
그 복잡함을 효과적으로 상대할 수 있는 전략과 기법이 필요하다. - 문제는 비즈니스 로직의 복잡함을 효과적으로 다루기 위한 방법과
기술적인 복잡함을 효과적으로 처리하는 방법이 다르기 때문에
가장 먼저 할 일은 성격이 다른 이 두 가지 복잡함을 분리해내는 것이다.
- 결국 근본적으로 엔터프라이즈 개발에 나타나는 복잡함의 원인은 제거 대상이 아니므로
- EJB는 기술적인 복잡함을 애플리케이션의 핵심 로직에서 일부분 분리하는데 성공하긴 했다.
- 하지만 EJB 환경에서 동작하기 위해 특정 인터페이스를 구현하고, 특정 클래스를 상속하고,
서버에 종속적인 서비스를 통해서만 접근하고 사용이 가능하게 만들게 되었다. - 애플리케이션 로직을 담은 핵심 코드에서 일부 기술적인 코드가 제거된 것은 사실이지만,
오히려 환경과 스펙에 종속되는 코드로 만들어져 하는 더 큰 부담을 안게 됐다. - 가장 치명적인 건, EJB라는 틀 안에서 자바 코드를 만들게 강제함으로써
자바 언어의 객체지향적인 특성도 잃어버리게 되었다.
- 하지만 EJB 환경에서 동작하기 위해 특정 인터페이스를 구현하고, 특정 클래스를 상속하고,
- 스프링은 EJB의 처음 목표와 마찬가지로 기술적인 복잡함을 애플리케이션의 핵심 로직의 복잡함에서 제거하는데 목표를 뒀다.
- 그 과정에서 EJB처럼 개발자의 코드에 난입해서 지저분하고 복잡한 코드를 만들어버리는 실수를 하지는 않았다.
- 스프링은 비침투적인 기술 전략을 통해 기술을 적용함으로써 기술의 적용 사실이 코드에 직접 반영되지 않는 특징으로
애플리케이션 코드에 여기저기 불쑥 등장하거나 코드의 설계와 구현 방식을 제한하지 않는다. - 꼭 필요할 것 같은 경우조차 기술 코드가 직접 노출되지 않도록 만들어줬다.
그러므로 기술적인 복잡함과 비즈니스 로직을 다루는 코드를 깔끔하게 분리할 수 있다. - 물론 스프링을 적용한다고 해서 근본적인 원인이 사라진 건 아니지만
스프링을 통해 성격이 다른 복잡함들을 깔끔하게 분리해줬기 때문에 각각을 효과적으로 상대할 수 있는 기반이 마련됐다.
동시에 코드에 불필요하게 등장해서 부가적인 복잡함을 가져오지도 않았다.
- 그 과정에서 EJB처럼 개발자의 코드에 난입해서 지저분하고 복잡한 코드를 만들어버리는 실수를 하지는 않았다.
복잡함을 상대하는 스프링의 전략
- 스프링의 기본적인 전략은 비즈니스 로직을 담은 애플리케이션 코드와
엔터프라이즈 기술을 처리하는 코드를 분리시키는 것이다.
이 분리를 통해 두 가지 복잡함의 문제를 효과적으로 공략하게 해준다. - 스프링은 엔터프라이즈 기술을 적용했을 때 발생하는 복잡함의 문제를 두 가지로 분류하고
각각에 대한 적절한 대응 방법을 제공한다.- 스프링은 일관성 없는 기술과 서버환경의 변화에 대해 서비스 추상화를 통해 공략했다.
기술적인 복잡함은 일단 추상화를 통해 로우레벨의 기술 구현 부분과 기술을 사용하는 인터페이스를 분리하고,
환경과 세부 기술에 독립적인 접근 인터페이스를 제공하도록 한다.
이를 통해 테스트 편의성을 증대시키고 기술에 대한 세부 설정과 환경으로부터 독립적인 코드를 만들 수 있다.
예) 트랜잭션 추상화, OXM 추상화, 데이터 액세스 기술에 독립적으로 적용 가능한 트랜잭션 동기화 기법 등
스프링이 제공하는 템플릿/콜백 패턴은 판에 박힌 반복적인 작업 흐름과 API 사용 코드를 제거해주어
기술을 사용하는 코드도 최적화된 핵심 로직에만 집중하도록 도와준다. - 스프링은 기술과 비즈니스 로직의 혼재로 발생하는 복잡함을 해결하기 위한 AOP 접근 방법을 제공한다.
AOP는 최후까지 애플리케이션 로직을 담당하는 코드에 남아 있는 기술 코드를 깔끔하게 분리해서 별도의 모듈로 관리한다.
이를 통해 비즈니스 로직과 지저분하게 얽혀 다루기 힘들거나 여기저기 중복되어 나타나는 기술적인 코드를 제거할 수 있다.
- 스프링은 일관성 없는 기술과 서버환경의 변화에 대해 서비스 추상화를 통해 공략했다.
- 스프링은 비즈니스 로직의 복잡함을 상대하기 위해 자바라는 객체지향 기술 그 자체를 전략으로 사용한다.
- 비즈니스 로직에 오류가 발생하면 엄청난 사고로 이어질 수 있어 가장 중요하게 다뤄져야 하고 가장 많이 신경 써야 한다.
- 엔터프라이즈 시스템 개발의 흐름은 점차 비즈니스 로직은 애플리케이션 안에서 처리하도록 만드는 추세이며
DB는 단지 데이터의 영구적인 저장과 복잡한 조건을 가진 검색과 같은 자체적으로 특화된 기능에만 활용하고,
데이터를 분석하고 가공하고 그에 따라 로직을 처리하는 부분은 확장하기 쉽고,
비용도 싼 애플리케이션 서버 쪽으로 이동하는 것이다. - 환경에 종속적인 기술과 침투적인 기법으로 인해 추가된 군더더기에 방해만 받지 않는다면
객체지향 언어로의 장점을 잘 살려 비즈니스 로직의 복잡함을 최대한 효과적으로 다룰 수 있는 깔끔한 코드를 만들 수 있다. - 이 영역에는 스프링조차 관여하지 않으며
다만 뒤에서 비즈니스 로직을 담당하는 오브젝트들에게 적절한 엔터프라이즈 기술 서비스가 제공되도록 도와줄 뿐이다.
즉, 스프링은 단지 객체지향 언어의 장점을 제대로 살리지 못하게 방해했던 요소를 제거하도록 도와줄 뿐이다.
- 기술과 비즈니스 로직의 복잡함을 해결하는데 스프링이 공통적으로 사용하는 도구로는 객체지향이 있다.
- 스프링은 자바의 기본인 객체지향에 충실한 설계가 가능하도록 단순한 오브젝트로 개발할 수 있고,
객체지향의 설계 기법을 잘 적용할 수 있는 구조를 만들기 위해
DI 같은 유용한 기술을 편하게 적용하도록 도와주는 것이 스프링의 기본 전략이다. - 서비스 추상화, 템플릿/콜백, AOP와 같은 스프링의 기술은 DI 없이는 존재할 수 없는 것들이다.
DI는 자연스럽게 객체지향적인 설계와 개발로 이끌어주는 좋은 동반자다.
스프링은 단지 그것을 더욱 편하고 쉽게 사용하도록 도와줄 뿐이다. - 그러므로 DI는 좋은 오브젝트 설계의 결과물이기도 하지만,
반대로 DI를 열심히 적용하다 보면 객체지향 설계의 원칙을 잘 따르고 그 장점을 살린 설계가 나올 수도 있다.
- 스프링은 자바의 기본인 객체지향에 충실한 설계가 가능하도록 단순한 오브젝트로 개발할 수 있고,
- 기술적인 복잡함에는 DI가 바탕이 된 여러 가지 기법, 비즈니스 로직의 복잡함에는 객체지향 설계 기법을 적용하자.
- 기술적인 복잡함을 해결하는 문제나 기술적인 복잡함이
비즈니스 로직에 침범하지 못하도록 분리하는 경우에도 DI가 바탕이 된 여러 가지 기법이 활용된다. - 반면에 비즈니스 로직 자체의 복잡함을 해결하려면 DI보다는 객체지향 설계 기법이 더 중요하다.
- 스프링은 기술적인 코드와 특정 기술의 스펙이 침범하지 않는 코드로 만들어주어
순수한 비즈니스 로직만을 담은 코드를 통해 객체지향 분석과 설계에서 나온 도메인 모델을 쉽게 적용할 수 있도록 해준다. - 객체지향적인 특성을 잘 살린 설계는 상속과 다형성, 위임을 포함해서
많은 객체지향 디자인 패턴과 설계 기법이 잘 녹아들어 갈 수 있다.
그러므로 이러한 객체지향 기술의 장점을 최대한 활용해서 복잡하고 자주 변하는 업무를 지원하는 시스템을 만들 수 있다. - 결국 모든 스프링의 기술과 전략은
- 객체지향이라는 자바 언어가 가진 강력한 도구를 극대화해서 사용할 수 있도록 돕는 것이라고 볼 수 있다.
- 기술적인 복잡함을 해결하는 문제나 기술적인 복잡함이
- 이처럼 스프링의 목적을 바로 이해하고,
그 목적을 이루는 도구로 스프링을 잘 활용해야만 스프링으로부터 제대로 된 가치를 얻을 수 있다. - 어떤 기술이든 그 자체로는 도구에 불과하다.
그것을 용도에 맞게 잘 활용해서 궁극적으로 이루고자 하는 목표를 이루는 것이 중요하다.
'Java-Spring > 토비의 스프링 3.1' 카테고리의 다른 글
[토비의 스프링 3.1] Vol.1 스프링의 이해와 원리 - 스프링이란 무엇인가? (4) (0) | 2024.04.20 |
---|---|
[토비의 스프링 3.1] Vol.1 스프링의 이해와 원리 - 스프링이란 무엇인가? (3) (0) | 2024.04.17 |
[토비의 스프링 3.1] Vol.1 스프링의 이해와 원리 - 스프링이란 무엇인가? (1) (0) | 2024.04.16 |
[토비의 스프링 3.1] Vol.1 스프링의 이해와 원리 - 스프링이란 무엇인가? (0) (0) | 2024.04.16 |
[토비의 스프링 3.1] Vol.1 스프링의 이해와 원리 - 스프링 핵심 기술의 응용 (6) (0) | 2024.04.06 |
8.2) 스프링의 목적
엔터프라이즈 개발의 복잡함
- 전통적인 자바 엔터프라이즈 개발 기법 프로젝트는 여러 가지 원인으로 실패했었지만,
그중 가장 대표적인 이유는 엔터프라이즈 시스템 개발이 너무 복잡해져였다.- 엔터프라이즈 시스템이란 서버에서 동작하며 기업과 조직의 업무를 처리해주는 시스템을 말한다.
- 엔터프라이즈 시스템은 많은 사용자의 요청을 동시에 처리해야 하기 때문에
서버의 자원을 효율적으로 공유하고 분배해서 사용할 수 있어야 하며 보안과 안정성, 확장성 면에서도 뛰어나야 한다.
따라서 뛰어난 성능과 서비스의 안정성이 요구되고 그런 점을 고려한 개발 기술이 필요하다. - 즉, 엔터프라이즈 시스템을 개발하는데는
순수한 비즈니스 로직을 구현하는 것 외에도 기술적으로 고려할 사항이 많다는 뜻이다. - 따라서 이런 종류의 기술적인 문제를 고려하면서 애플리케이션을 개발해야 하는 부담을 안게 된다.
- 엔터프라이즈 시스템이란 서버에서 동작하며 기업과 조직의 업무를 처리해주는 시스템을 말한다.
- 엔터프라이즈 시스템이 기업 업무를 처리하는데 핵심적인 역할로 등장하고 중요해지면서
점점 더 기술적인 요구는 심화되고 그에 따른 복잡도는 증가한다.- 경제 흐름과 사회의 변화, 업계의 추이에 따라 수시로 업무 프로세스를 변경하고
애플리케이션을 자주 수정해줘야 하는 시대가 되었으므로
이전과 다르게 시스템 개발과 유지보수, 추가 개발 등의 작업에 대한 부담은 커지고
그에 따른 개발의 난이도도 더욱 증가한다. - 자바 엔터프라이즈 시스템 개발이 어려운 가장 큰 이유는 이처럼 근본적인 비즈니스 로직과
엔터프라이즈 기술이라는 두 가지 복잡함이 한데 얽혀 있기 때문이다. - 두 가지를 한 번에 다뤄야 하니 복잡함은 몇 배로 가중된다.
- 경제 흐름과 사회의 변화, 업계의 추이에 따라 수시로 업무 프로세스를 변경하고
복잡함을 해결하려는 도전
- 기술적인 복잡함을 해결하고자 보안을 취약하게 방치한다거나,
사용자가 늘어나도 더 이상 확장이 불가능한 시스템을 만들 수는 없다.- 결국 근본적으로 엔터프라이즈 개발에 나타나는 복잡함의 원인은 제거 대상이 아니므로
그 복잡함을 효과적으로 상대할 수 있는 전략과 기법이 필요하다. - 문제는 비즈니스 로직의 복잡함을 효과적으로 다루기 위한 방법과
기술적인 복잡함을 효과적으로 처리하는 방법이 다르기 때문에
가장 먼저 할 일은 성격이 다른 이 두 가지 복잡함을 분리해내는 것이다.
- 결국 근본적으로 엔터프라이즈 개발에 나타나는 복잡함의 원인은 제거 대상이 아니므로
- EJB는 기술적인 복잡함을 애플리케이션의 핵심 로직에서 일부분 분리하는데 성공하긴 했다.
- 하지만 EJB 환경에서 동작하기 위해 특정 인터페이스를 구현하고, 특정 클래스를 상속하고,
서버에 종속적인 서비스를 통해서만 접근하고 사용이 가능하게 만들게 되었다. - 애플리케이션 로직을 담은 핵심 코드에서 일부 기술적인 코드가 제거된 것은 사실이지만,
오히려 환경과 스펙에 종속되는 코드로 만들어져 하는 더 큰 부담을 안게 됐다. - 가장 치명적인 건, EJB라는 틀 안에서 자바 코드를 만들게 강제함으로써
자바 언어의 객체지향적인 특성도 잃어버리게 되었다.
- 하지만 EJB 환경에서 동작하기 위해 특정 인터페이스를 구현하고, 특정 클래스를 상속하고,
- 스프링은 EJB의 처음 목표와 마찬가지로 기술적인 복잡함을 애플리케이션의 핵심 로직의 복잡함에서 제거하는데 목표를 뒀다.
- 그 과정에서 EJB처럼 개발자의 코드에 난입해서 지저분하고 복잡한 코드를 만들어버리는 실수를 하지는 않았다.
- 스프링은 비침투적인 기술 전략을 통해 기술을 적용함으로써 기술의 적용 사실이 코드에 직접 반영되지 않는 특징으로
애플리케이션 코드에 여기저기 불쑥 등장하거나 코드의 설계와 구현 방식을 제한하지 않는다. - 꼭 필요할 것 같은 경우조차 기술 코드가 직접 노출되지 않도록 만들어줬다.
그러므로 기술적인 복잡함과 비즈니스 로직을 다루는 코드를 깔끔하게 분리할 수 있다. - 물론 스프링을 적용한다고 해서 근본적인 원인이 사라진 건 아니지만
스프링을 통해 성격이 다른 복잡함들을 깔끔하게 분리해줬기 때문에 각각을 효과적으로 상대할 수 있는 기반이 마련됐다.
동시에 코드에 불필요하게 등장해서 부가적인 복잡함을 가져오지도 않았다.
- 그 과정에서 EJB처럼 개발자의 코드에 난입해서 지저분하고 복잡한 코드를 만들어버리는 실수를 하지는 않았다.
복잡함을 상대하는 스프링의 전략
- 스프링의 기본적인 전략은 비즈니스 로직을 담은 애플리케이션 코드와
엔터프라이즈 기술을 처리하는 코드를 분리시키는 것이다.
이 분리를 통해 두 가지 복잡함의 문제를 효과적으로 공략하게 해준다. - 스프링은 엔터프라이즈 기술을 적용했을 때 발생하는 복잡함의 문제를 두 가지로 분류하고
각각에 대한 적절한 대응 방법을 제공한다.- 스프링은 일관성 없는 기술과 서버환경의 변화에 대해 서비스 추상화를 통해 공략했다.
기술적인 복잡함은 일단 추상화를 통해 로우레벨의 기술 구현 부분과 기술을 사용하는 인터페이스를 분리하고,
환경과 세부 기술에 독립적인 접근 인터페이스를 제공하도록 한다.
이를 통해 테스트 편의성을 증대시키고 기술에 대한 세부 설정과 환경으로부터 독립적인 코드를 만들 수 있다.
예) 트랜잭션 추상화, OXM 추상화, 데이터 액세스 기술에 독립적으로 적용 가능한 트랜잭션 동기화 기법 등
스프링이 제공하는 템플릿/콜백 패턴은 판에 박힌 반복적인 작업 흐름과 API 사용 코드를 제거해주어
기술을 사용하는 코드도 최적화된 핵심 로직에만 집중하도록 도와준다. - 스프링은 기술과 비즈니스 로직의 혼재로 발생하는 복잡함을 해결하기 위한 AOP 접근 방법을 제공한다.
AOP는 최후까지 애플리케이션 로직을 담당하는 코드에 남아 있는 기술 코드를 깔끔하게 분리해서 별도의 모듈로 관리한다.
이를 통해 비즈니스 로직과 지저분하게 얽혀 다루기 힘들거나 여기저기 중복되어 나타나는 기술적인 코드를 제거할 수 있다.
- 스프링은 일관성 없는 기술과 서버환경의 변화에 대해 서비스 추상화를 통해 공략했다.
- 스프링은 비즈니스 로직의 복잡함을 상대하기 위해 자바라는 객체지향 기술 그 자체를 전략으로 사용한다.
- 비즈니스 로직에 오류가 발생하면 엄청난 사고로 이어질 수 있어 가장 중요하게 다뤄져야 하고 가장 많이 신경 써야 한다.
- 엔터프라이즈 시스템 개발의 흐름은 점차 비즈니스 로직은 애플리케이션 안에서 처리하도록 만드는 추세이며
DB는 단지 데이터의 영구적인 저장과 복잡한 조건을 가진 검색과 같은 자체적으로 특화된 기능에만 활용하고,
데이터를 분석하고 가공하고 그에 따라 로직을 처리하는 부분은 확장하기 쉽고,
비용도 싼 애플리케이션 서버 쪽으로 이동하는 것이다. - 환경에 종속적인 기술과 침투적인 기법으로 인해 추가된 군더더기에 방해만 받지 않는다면
객체지향 언어로의 장점을 잘 살려 비즈니스 로직의 복잡함을 최대한 효과적으로 다룰 수 있는 깔끔한 코드를 만들 수 있다. - 이 영역에는 스프링조차 관여하지 않으며
다만 뒤에서 비즈니스 로직을 담당하는 오브젝트들에게 적절한 엔터프라이즈 기술 서비스가 제공되도록 도와줄 뿐이다.
즉, 스프링은 단지 객체지향 언어의 장점을 제대로 살리지 못하게 방해했던 요소를 제거하도록 도와줄 뿐이다.
- 기술과 비즈니스 로직의 복잡함을 해결하는데 스프링이 공통적으로 사용하는 도구로는 객체지향이 있다.
- 스프링은 자바의 기본인 객체지향에 충실한 설계가 가능하도록 단순한 오브젝트로 개발할 수 있고,
객체지향의 설계 기법을 잘 적용할 수 있는 구조를 만들기 위해
DI 같은 유용한 기술을 편하게 적용하도록 도와주는 것이 스프링의 기본 전략이다. - 서비스 추상화, 템플릿/콜백, AOP와 같은 스프링의 기술은 DI 없이는 존재할 수 없는 것들이다.
DI는 자연스럽게 객체지향적인 설계와 개발로 이끌어주는 좋은 동반자다.
스프링은 단지 그것을 더욱 편하고 쉽게 사용하도록 도와줄 뿐이다. - 그러므로 DI는 좋은 오브젝트 설계의 결과물이기도 하지만,
반대로 DI를 열심히 적용하다 보면 객체지향 설계의 원칙을 잘 따르고 그 장점을 살린 설계가 나올 수도 있다.
- 스프링은 자바의 기본인 객체지향에 충실한 설계가 가능하도록 단순한 오브젝트로 개발할 수 있고,
- 기술적인 복잡함에는 DI가 바탕이 된 여러 가지 기법, 비즈니스 로직의 복잡함에는 객체지향 설계 기법을 적용하자.
- 기술적인 복잡함을 해결하는 문제나 기술적인 복잡함이
비즈니스 로직에 침범하지 못하도록 분리하는 경우에도 DI가 바탕이 된 여러 가지 기법이 활용된다. - 반면에 비즈니스 로직 자체의 복잡함을 해결하려면 DI보다는 객체지향 설계 기법이 더 중요하다.
- 스프링은 기술적인 코드와 특정 기술의 스펙이 침범하지 않는 코드로 만들어주어
순수한 비즈니스 로직만을 담은 코드를 통해 객체지향 분석과 설계에서 나온 도메인 모델을 쉽게 적용할 수 있도록 해준다. - 객체지향적인 특성을 잘 살린 설계는 상속과 다형성, 위임을 포함해서
많은 객체지향 디자인 패턴과 설계 기법이 잘 녹아들어 갈 수 있다.
그러므로 이러한 객체지향 기술의 장점을 최대한 활용해서 복잡하고 자주 변하는 업무를 지원하는 시스템을 만들 수 있다. - 결국 모든 스프링의 기술과 전략은
- 객체지향이라는 자바 언어가 가진 강력한 도구를 극대화해서 사용할 수 있도록 돕는 것이라고 볼 수 있다.
- 기술적인 복잡함을 해결하는 문제나 기술적인 복잡함이
- 이처럼 스프링의 목적을 바로 이해하고,
그 목적을 이루는 도구로 스프링을 잘 활용해야만 스프링으로부터 제대로 된 가치를 얻을 수 있다. - 어떤 기술이든 그 자체로는 도구에 불과하다.
그것을 용도에 맞게 잘 활용해서 궁극적으로 이루고자 하는 목표를 이루는 것이 중요하다.
'Java-Spring > 토비의 스프링 3.1' 카테고리의 다른 글
[토비의 스프링 3.1] Vol.1 스프링의 이해와 원리 - 스프링이란 무엇인가? (4) (0) | 2024.04.20 |
---|---|
[토비의 스프링 3.1] Vol.1 스프링의 이해와 원리 - 스프링이란 무엇인가? (3) (0) | 2024.04.17 |
[토비의 스프링 3.1] Vol.1 스프링의 이해와 원리 - 스프링이란 무엇인가? (1) (0) | 2024.04.16 |
[토비의 스프링 3.1] Vol.1 스프링의 이해와 원리 - 스프링이란 무엇인가? (0) (0) | 2024.04.16 |
[토비의 스프링 3.1] Vol.1 스프링의 이해와 원리 - 스프링 핵심 기술의 응용 (6) (0) | 2024.04.06 |