목록Spring (8)
forDevLife
먼저 Extension에 대해 몇 가지 구현된 예시를 알아보고, 간단히 데이터베이스를 롤백하는 Extension을 직접 만들어보도록 하자. 실습 코드 https://github.com/leejohy-0223/junit_study GitHub - leejohy-0223/junit_study Contribute to leejohy-0223/junit_study development by creating an account on GitHub. github.com 1. Extension 이란? JUnit 5에 추가된 extension(FunctionalInterface)를 통해 Test class, method를 확장할 수 있다. 동작 방식은 테스트의 이벤트, Life Cycle에 관여하게 되며, ExtendW..
해당 글은 WAS의 커넥션, 스레드 풀에 대해서 정리하였습니다. 1. 커넥션 풀? 스레드 풀? MySQL에서 사용자 요청을 처리하는 포그라운드(foreground) 스레드에 대해서 학습하다가, 커뮤니티 버전과 엔터프라이즈 버전에서 MySQL 서버의 스레드가 사용자 요청 connection을 다르게 처리한다는 것을 알게 되었습니다. 그 과정에서 커넥션 풀, 스레드 풀의 용어가 나오는데 이게 우리가 개발하는 애플리케이션에 포함되는건지 MySQL 서버에 포함되는건지 헷갈려서 정리하게 되었습니다. 결론부터 얘기하면 다음과 같습니다. 커넥션 풀 : WAS에서 관리(Hikari CP) 스레드(풀) : 각각 관리 WAS : ExecutorService를 사용한 스레드 관리 MySQL : 스레드 캐시(커뮤니티 ver)..
JPA는 Entity로 사용할 객체에 반드시 기본 생성자가 있어야 한다. 왜냐하면 java Reflection이 가져올 수 없는 정보 중 하나가 바로 생성자의 인자 정보들이기 때문이라고 한다. 하이버네이트에서 내부적으로 constructor.newInstance()라는 리플렉션을 통해 해당 Entity의 기본 생성자를 호출하여 객체를 생성하는데, 이는 구체적인 생성자의 매개변수를 알 수 없기 때문에(객체마다 매개변수는 모두 다를 것이기 때문에) 반드시 기본 생성자를 지정해둬야 한다. ※ 당연히 개발자가 작성한 생성자가 없다면, 자바에서 자동으로 기본 생성자를 만들어주기 때문에 작성해주지 않아도 된다. 이건 JPA 학습하면서 기본적으로 배우는 내용이지만, 다음 내용이 궁금해졌다. 1. 말로만 듣던 리플렉션..
1. AOP가 필요한 상황 - 모든 메서드의 호출 시간 측정 필요한 상황 - 핵심 로직이 아님에도, 너무 귀찮게 하나하나 하기 어렵다.(메서드가 천개라면, 위에 시간 측정을 다 붙여야 함..) - AOP가 필요한 시점임.. 2. AOP 적용 - 관점 지향 프로그래밍 - 공통 / 핵심 사항 분리 - 시간 측정 로직을, 원하는 곳에 적용하기 - 변경사항이 있으면, 이 로직만 변경하면 됨 - @Around를 통해, 원하는 적용 대상 선택 가능 - 메서드 실행 시, TimeTraceAop가 한번 intercept하여 실행 후, 메서드 실행됨 1) AOP 적용 전 의존 관계 2) AOP 적용 후 의존관계 - 가짜 멤버서비스(프록시)를 만들어 내어, 앞에 세워 둠 - joinPoint.proceed()에서 실제 서..
1. 회원 웹 기능 - 홈 화면 추가 - 컨트롤러가 정적 파일보다 우선순위가 높다. 요청이 오면, 컨테이너를 먼저 찾고, static 파일을 뒤진다. - 따라서 이전에 만들어 둔 index.html은 무시되고, 아래 home.html이 뜬다. 2. 회원 웹 기능 - 등록 - 아래의 createMemberForm.html을 view resolver에 의해 찾아져서, thymeleaf에 의해 렌더링 됨 - method가 'post'임 - PostMapping : 데이터를 전달할 때 쓰는 매핑(데이터 등록) - GetMapping : 기본적으로 url에 치는 방식(조회) - url은 같지만, post이기 때문에 create가 실행됨. * 자바빈 프로퍼티 규약 : getter / setter name을 prop..
1. 비즈니스 요구사항 정리 - 데이터 : 회원 ID, 이름 - 기능 : 회원 등록, 조회 - 아직 데이터 저장소가 선정되지 않음(가상의 시나리오) 2. 회원 도메인과 리포지토리 만들기 package hello.hellospring.repositiry; import hello.hellospring.domain.Member; import java.util.*; public class MemoryMemberRepository implements MemberRepository { private static Map store = new HashMap(); //sequence 는 key를 생성해주는 것임(0, 1, 2 ...) private static long sequence = 0L; @Override pub..
1. 프로젝트 생성 - 대부분 Gradle로 진행 : 의존관계가 있는 라이브러리를 함께 다운로드 - dependancy : 어떤 라이브러리를 땡겨올지 정해줌, 아래 두개 추가 후 generate - java 밑에 실제 source 파일 들어 있음 - test 관련된 source가 따로 나눠져 있음. - resources > java 파일 이외에 모든 것(html 등) - gradle : version 설정 및 library를 땡겨온다고만 생각(일단은) - repositories - mavenCentral() -> 공개된 사이트에서 라이브러리들을 받아라라는 의미. - dependencies > 위에서 추가했던게 implementation 되어 있음. + gitignore -> git에 필요한 src만 올라..
- 간단한 프로젝트 실습 https://start.spring.io/ 1) Maven / Gradle : 프로젝트 관리해주는 툴, 대부분 Gradle : 지금은 그냥 버전, 라이브러리 땡겨오는 거라고만 생각하자. 2) thymeleaf(View) : template engine(html 만드는) spring web 두 개를 dependancy로 하여 spring initializr 진행 3) Gradle, Maven은 의존관리를 관리해 줌 > 예를들어 내가 web을 땡기면, 알아서 다 땡겨주는 편리함(external library에서 땡긴거 볼 수 있음) > 실행만 했는데도, 웹서버(tomcat)이 뜸.(자동으로 tomcat library를 불러오는 것을 볼 수 있다) > sprint boot core도..