Java 71

들어가며

앞서 스프링 입문을 통해 스프링이 어떤 것이며, 스프링 컨테이너 / 스프링 빈/ 의존성 주입 등을 간략히 알아보았다. 이제는 스프링의 세부적인 내용과 왜 스프링을 사용해야하는지에 대해 알아보려한다. 먼저, 비지니스 로직을 설계하고 이를 순수 JAVA만으로 구현할 것이다. 그 후, 비지니스 로직에 변경이 필요할 때 순수 JAVA만을 사용한 다형성으로 객체지향설계 원칙인 SOLID를 지킬 수 있는지를 확인해보고 스프링이 왜 필요한지에 대한 근본적인 이유에 대해 알아 볼 것이다. 또한, 간략히 다루어보았던 Spring Bean, Spring Container, DI등에 대해 자세히 다루어 보려고 한다.

Spring/Spring Core 2021.03.02

객체 지향 설계와 스프링

⭐다시 스프링으로 스프링은 다음 기술로 다형성 + OCP / DIP를 가능하게 지원 DI(Dependency Injection) : 의존관계, 의존성 주입 DI 컨테이너 제공 클라이언트 코드의 변경 없이 기능 확장 쉽게 부품을 교체하듯이 개발 모든 설계에 역활과 구현을 분리 애플리케이션 설계도 공연을 설계 하듯 배역만 만들어두고, 배우는 언제든지 유연하게 변경할 수 있게 만드는 것이 좋은 객체 지향 설계이다. 이상적으로는 모든 설계에 인터페이스를 부여하는 것 어떤 DB를 쓸지 정해지지 않았더라도 인터페이스를 사용하면 구현만 하여 교체할 수 있다. 하부 구현 기술들에 대한 선택을 최대한 미룰 수 있는 장점이 있다. ex) 할인 정책들이 정해지지 않았다고 판매 로직에 대한 개발이 중단되면 안된다. 인터페이스..

Spring/Spring Core 2021.03.01

좋은 객체 지향 프로그래밍이란?

객체 지향 특징 추상하 캡슐화 상속 다형성 객체 지향 프로그래밍 객체 지향 프로그래밍은 컴퓨터 프로그램을 명렁어의 목록으로 보는 시각에서 벗어나 여러 개의 독립된 단위, 즉 "객체"들의 모임으로 파악하고자 하는 것이다. 각각의 객체는 메시지를 주고받고, 데이터를 처리할 수 있다.(협력) 객체 지향 프로그래밍은 프로그램을 유연하고 변경이 용이하게 만들기 때문에 대규모 소프트웨어 개발에 많이 사용된다. 유연하고, 변경이 용이?? 레고 블럭 조립하듯이 키보드, 마우스 갈아 끼우듯이 컴퓨터 부품 갈아 끼우듯이 컴포넌트를 쉽고 유연하게 변경하면서 개발할 수 있는 방법 ⭐그것이 바로 다형성(Polymorphism)⭐ 다형성을 통해서 무한한 확장이 가능해진다. 클라이언트에 영향을 주지 않고 새로운 기능을 제공할 수 ..

Spring/Spring Core 2021.03.01

스프링의 탄생 배경과 스프링

2000년대 초반의 상황 EJB(Enterprise Java Beans) ==> 자바진영의 표준기술 거의 종합선물세트 당시에 보급이 잘되고, 기술영업이 잘되었음. 컨테이너 기술, 설정에 의한 트랜잭션 관리, 분산 처리 기술 등 고급기술에 대한 지원이 잘되었음. 당시에 entity bean(orm기술==> 쿼리를 쓰지않고 자바객체를 db에 넣는 기술)도 가지고 있었음. but 엄청 비쌌음. 한대의 서버를 구성하려면 수천만원이 들었음(지금은 spring, tomcat등으로 무료로 구성가능) EJB지옥 엄청 어렵고, 복잡하고, 느림.(이론적으로는 최고 but, 개발자들에게는 엄청난 고통) interface를 모두 구현해야했고, EJB에 의존적으로 개발해야했음. 이로인해 코드도 지저분해지고 life cycle관..

Spring/Spring Core 2021.02.28

AOP 적용

공통 관심 사항(cross-cutting concern) vs 핵심 관심 사항(core concern) 분리 1. 공통 로직 만들기 (시간 측정) @Aspect 애노테이션을 통해 AOP로 사용하겠다는 의미 @Around 애노테이션을 통해 타켓을 지정해 줄 수있는데 특정 클래스를 지정해줄 수 도 있다. 위에서는 hellospring패키지 안의 모든 클래스에 적용해주었다. joinPoint.proceed() : 다음 메소드 진행 joinPoint.toString()을 통하여 어떤 메소드를 call하는지 확인 2. AOP등록 스프링 빈으로 등록(@Bean) 컴포넌트 스캔(@Component) 스프링 빈에 등록해서 쓰는 것을 선호하는 경향임. 우리는 컴포넌트 스캔으로 진행 3. 실행 spring을 실행시키고 l..

AOP

AOP(Aspect Oriented Programming) - 관점 지향 프로그래밍 관점 지향은 쉽게 말해 어떤 로직을 기준으로 핵심적인 관점, 부가적인 관점으로 나누어서 보고 그 관점을 기준으로 각각 모듈화하겠다는 것이다. 여기서 모듈화란 어떤 공통된 로직이나 기능을 하나의 단위로 묶는 것을 말한다. 예로들어 핵심적인 관점은 결국 우리가 적용하고자 하는 핵심 비즈니스 로직이 된다. 또한 부가적인 관점은 핵심 로직을 실행하기 위해서 행해지는 데이터베이스 연결, 로깅, 파일 입출력 등을 예로 들 수 있다. AOP에서 각 관점을 기준으로 로직을 모듈화한다는 것은 코드들을 부분적으로 나누어서 모듈화하겠다는 의미다. 이때, 소스 코드상에서 다른 부분에 계속 반복해서 쓰는 코드들을 발견할 수 있는 데 이것을 흩어..

Spring Data JPA

Spring Data JPA 스프링 부트와 JPA만 사용해도 개발 생산성이 정말 많이 증가하고, 개발해야할 코드도 확연히 줄어듭니다. 여기에 스프링 데이터 JPA를 사용하면, 기존의 한계를 넘어 마치 마법처럼, 리포지토리에 구현 클래스 없이 인터페이스 만으로 개발을 완료할 수 있습니다. 그리고 반복 개발해온 기본 CRUD 기능도 스프링 데이터 JPA가 모두 제공합니다. 스프링 부트와 JPA라는 기반 위에, 스프링 데이터 JPA라는 환상적인 프레임워크를 더하면 개발이 정말 재밌어진다. 지금까지 조금이라도 단순하고 반복이라 생각했던 개발 코드들이 확연하게 줄어듭니다. 따라서 개발자는 핵심 비즈니스 로직을 개발하는데, 집중할 수 있습니다. 실무에서 관계형 데이터베이스를 사용한다면 스프링 데이터 JPA는 이제 ..

jpa

JPA JPA는 기존의 반복 코드는 물론이고, 기본적인 SQL도 JPA가 직접 만들어서 실행해준다. JPA를 사용하면, SQL과 데이터 중심의 설계에서 객체 중심의 설계로 패러다임을 전환을 할 수 있다. JPA를 사용하면 개발 생산성을 크게 높일 수 있다. ORM기술로써, Object(객체) Relational(관계형 DB)를 Mapping한다는 의미이다. * JPA라이브러리 추가(build.gradle) jdbc까지 다 포함하고 있음. * 스프링 부트에 JPA 설정 추가(application.properties) show-sql : JPA가 생성하는 SQL문장 출력 ddl-auto : JPA는 테이블을 자동으로 생성하는 기능을 제공하는데, none를 사용하면 해당 기능을 끈다. 우리는 테이블을 이미 만..

JdbcTemplate

스프링 JdbcTemplate과 MyBatis 같은 라이브러리는 JDBC API에서 본 반복 코드를 대부분 제거해준다. 하지만 SQL은 직접 작생해야 한다. ==> 반복 코드 ==> resultset같이 매번 반복되는 코드들 참고로 생성자가 하나일 때는 @Autowired를 생략해 줄 수 있다. DataSource 설정 위에서 bean으로 등록한 DataSource를 주입 @Autowired에 의해 주입 JdbcTemplate 객체를 생성하여 dataSource를 주입한다. CRUD API 제공 SQL문 작성 RowMapper interface 구현을 통해 SQL의 결과를 객체에 매핑하여 결과를 리턴 mapRow()라는 interface Method를 정의하여 결과처리 한 번만 사용하는 기능의 경우는 R..

스프링 통합 테스트

@Transactional 테스트를 할 때 이 애노테이션을 달면 트랜잭션을 먼저 실행하고 테스트를 실행한 후에(DB insert 등등) 마지막에 Rollback을 해준다. 앞서 우리가 @BeforeEach를 통하여 테스트마다 리포지토리를 비워주었던 일을 하지 않아도 된다. 테스트마다 rollback해줌. 추가로 @Commit 애노테이션은 테스트 후에 commi시켜 실제 db에 등록한다. @SpringBootTest @SpringBootTest는 스프링 부트 어플리케이션 테스트 시 테스트에 필요한 거의 모든 의존성을 제공 어노테이션 @SpringBootApplication을 기준으로 스프링 빈을 등록함과 동시에 Maven 같은 빌드 툴에 의해 추가된 스프링부트 의존성도 제공 @SpringBootTest 어..

반응형