반응형 혼자 공부하는 것들/Spring28 인터페이스 기반 프록시 VS 클래스 기반 프록시 https://applepick.tistory.com/159 프록시 패턴과 데코레이터 패턴 인프런 스프링 고급 원리를 들으면서 프록시 패턴과 데코레이터 패턴을 공부하고 있습니다. "둘이 뭔가 비슷한데? 뭐가 다른거지? 정확하게 어떠한 상황에서 사용해야 할까?"라고 느껴 정리를 applepick.tistory.com 앞서 프록시 패턴과 데코레이터 패턴에 대해서 간단하게 정리해보았습니다. 공부하면서 인터페이스에 기반한 프록시와 클래시 기반의 프록시의 장단점을 비교해보려고 합니다. 인터페이스가 없어도 클래스기반으로 프록시를 만들 수 있습니다. 클래스 기반의 프록시는 해당 클래스만 적용시킬 수 있고, 인터페이스 기반 프록시는 해당 인터페이스만 같다면 전체적으로 적용해서 사용할 수 있습니다. 클래스 기반 프록시는.. 2022. 5. 15. 프록시 패턴과 데코레이터 패턴 인프런 스프링 고급 원리를 들으면서 프록시 패턴과 데코레이터 패턴을 공부하고 있습니다. "둘이 뭔가 비슷한데? 뭐가 다른거지? 정확하게 어떠한 상황에서 사용해야 할까?"라고 느껴 정리를 해보려고 합니다. 프록시 패턴을 간단하게 말하자면 프록시는 다른 어떤 것과 이어지는 인터페이스의 역할을 하는 객체입니다. 객체에서 프록시가 되려면, 클라이언트는 서버에게 요청을 한 것인지, 프록시에게 요청을 한 것인지 조차 몰라야 합니다. 쉽게 이야기해서 서버와 프록시는 같은 인터페이스를 사용해야 합니다. 그리고 클라이언트가 사용하는 서버 객체를 프록시 객체로 변경해도 클라이언트 코드를 변경하지 않고 동작할 수 있어야 합니다. 프록시 패턴에서 클래스 의존관계를 보면 클라이언트는 서버 인터페이스( ServerInterfac.. 2022. 5. 10. 템플릿 메서드 패턴 GOF 디자인 패턴에서는 템플릿 메서드 패턴을 다음과 같이 정의했습니다. "작업에서 알고리즘의 골격을 정의하고 일부 단계를 하위 클래스로 연기합니다. 템플릿 메서드를 사용하면 하위 클래스가 알고리즘의 구조를 변경하지 않고도 알고리즘의 특정 단계를 재정의할 수 있습니다." [GOF] 부모 클래스에 템플릿을 정의하고, 일부 변경되는 로직은 자식 클래스에 정의하는 것입니다. 이렇게 하면 자식 클래스가 알고리즘의 전체 구조를 변경하지 않고, 특정 부분만 재정의할 수 있습니다. 결국 상속과 오버라이딩을 통한 다형성으로 문제를 해결하는 것입니다. 하지만 템플릿 메서드 패턴은 상속을 사용합니다. 따라서 상속에서 오는 단점들을 그대로 안고 갑니다. 특히 자식 클래스가 부모 클래스와 컴파일 시점에 강하게 결합되는 문제가.. 2022. 4. 25. Spring에서 동시성 문제를 해결해보자! [+ThreadLocal] 예를 들어 보드게임 중 할리갈리라는 게임이 있죠. 어떤 과일이든 합이 5개가 된다면 빠르게 종(인스턴스)을 치고(스레드) 해당 카드를 가져가는 게임입니다. 이 상황과 비슷하다고 느껴지지 않나요? 동시에 하나의 종을 여러 플레이어가 접근하는 게임입니다. 간단하게 이야기해보자면, 여러 스레드가 동시에 같은 인스턴스의 필드의 값을 변경하면서 발생하는 문제를 동시성 문제라고 합니다. 이러한 동시성 문제는 지역 변수에서 발생하지는 않습니다. 자바에서 지역변수는 스레드마다 각각 다른 메모리 영역을 할당하기 때문입니다. 또한, 값을 읽기만 했을 경우 동시성 문제가 발생하지는 않습니다. 다른 곳에서 값을 변경할 때 문제가 생깁니다. 이런 동시성 문제는 여러 쓰레드가 같은 인스턴스의 필드에 접근해야 하기 때문에 트래픽이.. 2022. 4. 19. Spring Boot에서 타임리프 이미지 동적 리소스 사용하기 스프링 부트에서 타임리프를 사용하던 중 이미지를 업로드 후 파일이 즉시 반영이 안 되는 이슈가 있었습니다. 스프링에서 static 폴더는 정적 리소스 폴더인데 여기 안에서 사용자가 이미지를 업로드하고, 삭제, 이용하게 설계해서 이슈가 발생했습니다. 대부분 AWS S3나 외부 디렉터리를 사용하여 컨트롤러 라우터에서 이미지 path를 받고, 외부 디렉터리에서 파일을 가져와 이미지를 뿌려주는 방식입니다. 여기서 중요한 점은 파일이 업로드한다고 해서 바로 웹 리소스로 쓸 수 없습니다. 컨트롤러에 한 번 요청해서 내려줘야 합니다. /resources/user 유저가 파일을 업로드하면 위와 같은 위치에 파일을 저장하게 됩니다. 여기서 웹 리소스로 한 번 더 매핑해서 내려주는 작업을 해주어야 합니다. package .. 2022. 2. 23. [Spring Boot] mybatis update, delete 무한대기 spring boot에서 mybatis를 사용하고 있습니다. 다른 환경에서 똑같은 디비 저장소(도커 컨테이너)를 사용하고 있는데, 다른 환경에서 트랜잭션이 걸려있을 경우 mybatis는 트랜잭션이 완료될 때까지 무한 대기상태가 됩니다. ㅠㅠ 테스트를 하기 위해 더미 유저를 만들어서 실험해보았습니다. pk값이 701인 유저 정보가 있습니다. delete 직후 아직 DB에 반영되지 않았습니다. commit을 하지 않았을 경우 spring boot에서 해당 로직을 사용한다면 결괏값이 반환되지 않고 무한 대기상태로 계속 있게 됩니다. 다른 환경에서 commit을 하여 디비에 반영하게 된 뒤에 로직이 정상적으로 실행되게 됩니다. 만약 쿼리에서 로직이 넘어가지 않는다면, 다른 환경에서 트랜잭션이 걸려있을 수 있으니.. 2022. 2. 21. [Spring Boot] 테스트 커버리지 툴 도입(JaCoCo) 회사 동기들과 프로젝트를 진행 중에 테스트 커버리지 툴을 도입하자고 설득하여 도입했습니다. 간단히 사용법을 정리해보려고 합니다. build.gradle에 의존성을 추가해줍니다. plugins { id 'org.springframework.boot' version '2.6.2' id 'io.spring.dependency-management' version '1.0.11.RELEASE' id 'java' id 'jacoco' } jacocoTestCoverageVerification { violationRules { rule { // 'element'가 없으면 프로젝트의 전체 파일을 합친 값을 기준으로 한다. limit { // 'counter'를 지정하지 않으면 default는 'INSTRUCTION' .. 2022. 2. 17. Spring Boot 이미지업로드 (환경: gradle, java11,Spring Boot 2.6.2, thymeleaf) 회원의 사진을 업로드하기 위해서 한번 구현해봤습니다. build.gradle dependencies { implementation 'commons-io:commons-io:2.6' ... } 의존성을 주입해줍니다. form.html .... form에서 중요한 부분이 바로 enctype="multipart/form-data"를 추가해줘야합니다. 간단하게 설명하자면, enctype는 폼 데이터(form data)가 서버로 제출될 때 해당 데이터가 인코딩되는 방법을 명시해줍니다. common.properties ## FilePath file.path=/Users/sungmin/Desktop/~/images/user properties에 파일을 저장할 위치를 선언해줍니다. 이 방법을 쓴 이유는 밑에서 설명해드.. 2022. 2. 14. Spring 빈 스코프를 알아보자♻️ 빈 스코프는 말 그대로 스프링 빈이 존재할 수 있는 범위를 말합니다. 스프링은 아래와 같은 스코프를 지원합니다. 싱글톤: 기본 스코프, 스프링 컨테이너의 시작과 종료까지 유지되는 가장 넓은 범위의 스코프입니다. 프로토타입: 스프링 컨테이너는 프로토타입 빈의 생성과 의존관계 주입까지만 관여하고 더는 관리하지 않는 매우 짧은 범위의 스코프입니다. 웹 관련 스코프 request: 웹 요청이 들어오고 나갈때 까지 유지되는 스코프입니다. session: 웹 세션이 생성되고 종료될 때 까지 유지되는 스코프입니다. application: 웹의 서블릿 컨텍스트와 같은 범위로 유지되는 스코프입니다. https://applepick.tistory.com/129 스프링에서 싱글톤 적용 시 주의 할 점! ⚠️ 스프링 컨테이너.. 2022. 1. 31. 이전 1 2 3 4 다음 반응형