Web/Spring 20

컴포넌트 스캔

컴포넌트 스캔과 의존관계 자동 주입 시작하기 스프링 빈을 등록할 때 자바 코드의 @Bean이나 XML의 등을 통해서 설정 정보에 직접 등록할 스프링 빈을 나열하는 방식은 이렇게 등록해야 할 스프링 빈이 수십, 수백 개가 되면 일일이 등록하기도 귀찮고, 설정 정보도 커지고, 누락하는 문제도 발생한다. 그래서 스프링은 설정 정보가 없어도 자동으로 스프링 빈을 등록하는 컴포넌트 스캔이라는 기능을 제공한다. 또 의존 관계도 자동으로 주입하는 @Autowired 라는 기능도 제공한다. @Configuration @ComponentScan( excludeFilters = @Filter(type = FilterType.ANNOTATION, classes = Configuration.class)) public clas..

Web/Spring 2021.08.10

싱글톤 컨테이너

웹 어플리케이션과 싱글톤 스프링 없는 순수한 DI 컨테이너인 AppConfig는 요청을 할 때마다 객체를 새로 생성한다. 웹 애플리케이션은 보통 여러 고객이 동시에 요청을 한다. 그런데 고객 트래픽이 초당 100이 나오면 초당 100개 객체가 생성되고 소멸된다! ➡︎ 메모리 낭비 해결방안은 해당 객체가 딱 1개만 생성되고, 해당 인스턴스를 공유하도록 설계하면 된다. ➡︎ 싱글톤 패턴 싱글톤 패턴 클래스의 인스턴스가 딱 1개만 생성되는 것을 보장하는 디자인 패턴이다. (한 자바 서버 안에서는 객체 인스턴스가 딱 1개만 생성된다) 어떻게 해야할까 ? ➡︎ 객체 인스턴스를 2개 이상 생성하지 못하도록 막아야 한다. private 생성자를 사용해서 외부에서 임의로 new 키워드를 사용하지 못하도록 막아야 한다...

Web/Spring 2021.08.07

스프링 컨테이너와 스프링 빈

스프링 컨테이너 생성 // 스프링 컨테이너 생성 // ApplicationContext 인터페이스의 구현체 ApplicationContext applicationContext = new AnnotationConfigApplicationContext(AppConfig.class); // 꺼내기 // getBean(꺼낼거 이름(메서드 이름) , 반환타입) MemberService memberService = applicationContext.getBean("memberService", MemberService.class); ApplicationContext : 스프링 컨테이너. ApplicationContext는 인터페이스이다(→ 다형성 적용되어있음) 스프링 컨테이너는 @Configuration 이 붙은 A..

Web/Spring 2021.07.30

스프링 핵심 원리 이해 (AppConfig)

회원 도메인 설계 아래와 같은 다이어그램은 기획자들도 볼 수 있는 그림이다. 위의 다이어그램을 개발자가 구체화해서 클래스 다이어그램을 만들어낸다. (인터페이스랑 구현체들이 다 보이는거) 그리고 아래 다이어그램은 실제 서버를 실행하지 않고, 클래스를 분석해서 볼 수 있는 객체 다이어그램이다. 구현체는 동적으로(예를 들어 어떤 DB를 넣을지) 결정된다.(서버가 뜰때 new해서 뭘 넣을건지) 그래서 클래스 다이어그램만으로 판단하기 어렵다. 그래서 동적인 객체 다이어그램이 필요하다. 서버가 뜰 때, 클라이언트가 실제 사용할때 new한 인스턴스의 참조를 나타낸다. ✔︎ HashMap 보다는 ConcurrentHashMap을써줘야한다. HashMap은 동시성 문제가 발생할 수 있기 때문이다. ✔︎ 관례) 구현체 하..

Web/Spring 2021.07.27

AOP

AOP가 필요한 상황 모든 메서드의 호출 시간을 측정하고 싶다면? 공통 관심 사항(cross-cutting concern) vs 핵심 관심 사항(core concern) 회원 가입 시간, 회원 조회 시간을 측정하고 싶다면? 이렇게 시간측정 로직을 메소드별로 붙여준다면 발생하는 문제 회원가입, 회원 조회에 시간을 측정하는 기능은 핵심 관심 사항이 아니다. 시간을 측정하는 로직은 공통 관심 사항이다. 시간을 측정하는 로직과 핵심 비즈니스의 로직이 섞여서 유지보수가 어렵다. 시간을 측정하는 로직을 별도의 공통 로직으로 만들기 매우 어렵다. 시간을 측정하는 로직을 변경할 때 모든 로직을 찾아가면서 변경해야 한다. AOP 적용 AOP: Aspect Oriented Programming 공통 관심 사항(cross-..

Web/Spring 2021.07.25

스프링 DB 접근 기술

H2 데이터베이스 설치 : 개발이나 테스트 용도로 가볍고 편리한 DB, 웹 화면 제공 ( https://www.h2database.com ) 다운로드 및 설치 h2 데이터베이스 버전은 스프링 부트 버전에 맞춘다. 권한 주기: chmod 755 h2.sh 실행: ./h2.sh 데이터베이스 파일 생성 방법 jdbc:h2:~/test (최초 한번) (파일 경로) ~/test.mv.db 파일 생성 확인 이후부터는 jdbc:h2:tcp://localhost/~/test 이렇게 접속 (이렇게 하면 직접 접근이 아니라 소켓 통해서 접근하는 것. 그럼 여러 군데에서 접근할 수 있다.) * sql 폴더 따로 만들어서 (아예 밖에) 파일 만들어서 sql문 적어두면, git 쓰면 변경내역 관리되고 그거보고 파악되니까 좋음 ..

Web/Spring 2021.07.25

스프링 빈과 의존관계 / 웹 MVC 개발

스프링 빈을 등록하고, 의존관계 설정하기 memberService랑 memberRepository 만든 걸 화면에 붙이고 싶어 → 컨트롤러랑 뷰템플릿이 필요하다. memberController가 memberService를 통해서 회원가입하고 조회할 수 있어야 한다. 이런 것을 의존관계가 있다고 표현한다.(memberController가 memberService를 의존) 따라서 회원 컨트롤러가 회원서비스와 회원 리포지토리를 사용하려면 의존관계가 있어야한다. ✔︎ @Controller 어노테이션이 붙으면 스프링 컨테이너가 스프링 뜰 때 멤버 컨트롤러 객체를 생성해서 스프링에 넣어놓고 관리한다. → 이를 컨테이너에서 스프링 빈이 관리된다라고 표현한다. ✔︎ 생성자에 @Autowired 있으면 스프링이 연관된 ..

Web/Spring 2021.07.25

회원 관리 예제 - 백엔드 개발

비즈니스 요구사항 정리 컨트롤러: 웹 MVC의 컨트롤러 역할 서비스: 비즈니스 도메인 객체를 가지고 핵심 비즈니스 로직 구현, 예) 회원 중복 가입 X 리포지토리: 데이터베이스에 접근, 도메인 객체를 DB에 저장하고 관리 도메인: 비즈니스 도메인 객체, 예) 회원, 주문, 쿠폰 등등 주로 데이터베이스에 저장하고 관리됨 * Optional : findbyId, findbyname 했을 때 없으면 null을 반환한다. (요즘은 null을 처리하는 방법에서 null을 그대로 반환하는 방법 대신, optional로 감싸서 반환하는 방법을 많이 선호한다.) * sequence: 0, 1, 2 이렇게 키 값을 형성해주는 아이. 회원 리포지토리 테스트 케이스 작성 개발한 기능을 실행해서 테스트할 때 자바의 main ..

Web/Spring 2021.07.25

스프링 웹 개발 기초(정적 컨텐츠, MVC와 템플릿 엔진, API)

웹 개발에는 세 가지 방식이 있다. 정적 컨텐츠 : 서버에서 하는 거 없이 html 파일 그대로 웹브라우저로 내려준다. mvc & 템플릿 엔진 : JSP, PHP와 같이 html을 그냥 주는 것이 아니라, 서버에서 프로그래밍한 후 html을 동적으로 바꿔서 내려준다. API : 요즘은 json이라는 데이터 구조 포맷으로 클라이언트한테 데이터를 전달해준다. 1. 정적 컨텐츠 스프링 부트는 정적 컨텐츠 기능을 제공한다(링크) 원하는 파일(html)을 넣으면 정적 파일 그대로 반환이 된다. 그 대신 이 파일을 프로그래밍할 수 없다. 웹브라우저에서 localhost:8080/hello-static.html을 치면 내장 톰켓 서버가 요청을 받고 이런 요청이 왔대 하고 스프링에게 넘긴다. 근데 스프링은 먼저 hel..

Web/Spring 2021.07.24

스프링 프로젝트 환경설정

폴더 & 파일 설명 .Idea : intelli J가 사용하는 설정 파일 src main resources : 자바 파일 제외한 파일들 (xml, html, properties, 설정 파일 등) test : 테스트 코드 소스들이 들어감. build.gradle : plugin 에 우리가 spring boot에서 프로젝트 선택 부분에서 선택한 버전, 언어 등이 들어간다. sourceCompatibility : 자바 버전 dependencies : dependencies에서 선택했던 것과 test library 들어가 있다. repositories: 현 강의에서는 mavenCentral()이 들어가 있는데(공개된 사이트), dependencies에 있는 라이브러리를 여기에서 다운로드한다. 필요하면 특정 사이..

Web/Spring 2021.07.20