본문 바로가기

Spring

(48)
[Spring] IoC, DI 컨테이너 제어의 역전 IoC (Inversion of Control)기존 프로그램은 클라이언트 구현 객체가 스스로 필요한 서버 구현 객체를 생성하고, 연결하고, 실행했다. 한마디로 구현 객체가 프로그램의 제어 흐름을 스스로 조종했다. 개발자 입장에서는 자연스러운 흐름이다.반면에 AppConfig가 등장한 이후에 구현 객체는 자신의 로직을 실행하는 역할만 담당한다. 프로그램의 제어 흐름은 이제 AppConfig가 가져간다. 예를 들어서 OrderServiceImpl 은 필요한 인터페이스들을 호출하지만 어떤 구현 객체들이 실행될지 모른다.  프로그램에 대한 제어 흐름에 대한 권한은 모두 AppConfig가 가지고 있다. 심지어 OrderServiceImpl 도 AppConfig가 생성한다. 그리고 AppConfig는..
[Spring] OCP, DIP 원칙을 지켜주는 AppConfig 새로운 할인 정책 적용과 문제점할인 정책을 변경하려면 클라이언트인 OrderServiceImpl 코드를 고쳐야 한다.private final MemberRepository memberRepository = new MemoryMemberRepository();// private final DiscountPolicy discountPolicy = new FixDiscountPolicy();// 할인 정책 변경, OCP 원칙 위반, DIP 원칙 위반(추상화 뿐만 아니라 구체화 의존)private final DiscountPolicy discountPolicy = new RateDiscountPolicy() 문제점 발견우리는 역할과 구현을 충실하게 분리했나? => OK다형성도 활용하고, 인터페이스와 구현 객체를..
[Spring] 객체 지향 설계 SOLID 원칙 SOLID클린코드로 유명한 로버트 마틴이 좋은 객체 지향 설계의 5가지 원칙을 정리SRP: 단일 책임 원칙(single responsibility principle)OCP: 개방-폐쇄 원칙 (Open/closed principle)LSP: 리스코프 치환 원칙 (Liskov substitution principle)ISP: 인터페이스 분리 원칙 (Interface segregation principle)DIP: 의존관계 역전 원칙 (Dependency inversion principle) SRP 단일 책임 원칙single responsibility principle한 클래스는 하나의 책임만 가져야 한다. 하나의 책임이라는 것은 모호하다.클 수 있고, 작을 수 있다.너무 잘게 잘라서도 안되고 너무 크게 잘라..
[Spring] AOP AOP가 필요한 상황모든 메소드의 호출 시간을 측정하고 싶다면?공통 관심 사항(cross-cutting concern) vs 핵심 관심 사항(core concern)회원 가입 시간, 회원 조회 시간을 측정하고 싶다면?  MemberService 회원 조회 시간 측정 추가package com.example.hello_spring.service;import com.example.hello_spring.domain.Member;import com.example.hello_spring.repository.MemberRepository;import com.example.hello_spring.repository.MemoryMemberRepository;import org.springframework.beans.f..
[Spring] 스프링 DB 접근 기술 목차순수 JDBCJdbcTemplateJPAJPA DATA 순수 JDBC 환경 설정build.gradle 파일에 jdbc, h2 데이터베이스 관련 라이브러리 추가implementation ("org.springframework.boot:spring-boot-starter-jdbc")runtimeOnly ("com.h2database:h2")  스프링 부트 데이터베이스 연결 설정 추가spring.datasource.url= jdbc:h2:tcp://localhost/~/testspring.datasource.driver-class-name=org.h2.Driverspring.datasource.username=sa   JDBC 리포지토리 구현MemberRepositorypackage com.example...
[Spring] spring-boot-devtools Devtoolshtml 파일을 컴파일만 해주면 서버 재시작 없이 View 파일 변경이 가능하다. Devtools 기능Property DefaultsSpring에서 제공하는 thymeleaf는 캐싱 기능을 사용한다. 캐싱이 되면 파일을 수정하더라도 바로 반영되지 않는다. Automatic Restart파일 수정 후 저장을 하면 Classpath에 존재하는 파일의 변경을 감지하고, 자동으로 서버를 restart 해준다.설정을 통해 원하는 디렉토리만 트리거로 설정할 수도 있다.Live ReloadHTML 파일을 수정하기만 해도 자동으로 브라우저가 새로 고침된다.내부적으로 live reload 서버를 두고 브라우저 확장프로그램과 통신하는 방식으로 동작.Global SettingsRemote Application..
[Spring] 웹 개발 방식 스프링 웹 개발 기초웹을 개발하는 3가지 방법 정적 컨텐츠정적 컨텐츠는 파일을 그대로 그냥 고객한테 웹브라우저로 전달해주는 방식MVC와 템플릿 엔진서버에서 변형을 해서 HTML을 바꿔서 내려주는 방식APIJSON 데이터 구조 포멧으로 클라이언트에게 데이터를 전달하는 방식서버끼리 데이터들을 통신할 때   정적 컨텐츠 [resources/static/hello-static.html]정적 컨텐츠 입니다. http://localhost:8080/hello-static.html 정적 컨텐츠 입니다." data-ke-type="html">HTML 삽입미리보기할 수 없는 소스 웹브라우저에 http://localhost:8080/hello-static.html을 친다.내장 Tomcat 서버가 이 요청을 받고, 스프링 ..
[Spring] 정적 페이지, 템플릿 엔진 동작 [HelloController] package hello.hellospring.controller; import org.springframework.stereotype.Controller; import org.springframework.ui.Model; import org.springframework.web.bind.annotation.GetMapping; @Controller public class HelloController { @GetMapping("hello") public String hello(Model model) { model.addAttribute("data", "hello!"); return "hello"; } } @getMapping("hello") 는 웹 어플리케이션에서 http:..