Java 84

[Spring] @PropertySource, @Value 어노테이션에 대해 알아보자

개발을 할 때, Property 파일을 resource 폴더 내에 만들어 두고 필요할 때 해당 값을 많이 읽어옵니다. 주로 데이터베이스 연결 설정이나 Property 파일의 속성을 주입할 때 사용합니다. 즉, @PropertySource 어노테이션을 통해 외부의 설정 파일(.properties, .yml)을 읽어와 해당 정보를 사용할 수 있게 됩니다. 이제 @PropertySource, @Value에 대해 간단하게 설명 드리도록 하겠습니다. @PropertySource("value = "classpath:allergy.properties") classpath:allergy.properties 경로에 있는 설정 파일을 읽어옵니다. Environment 객체를 이용해서 해당 설정 값을 가져올 수 있습니다. ..

Java/Spring 2023.11.25

[Spring] JPA Auditing 기술을 사용하여 생성일자, 수정일자 컬럼의 데이터 형식을 깔끔하게 지정하는법

JPA Auditing 기술은 엔티티를 생성 및 변경할 때, 생성시간, 수정시간 등을 자동으로 삽입해 주는 기능입니다. Audit은 감사하다, 추적하다의 의미를 지니는데, Auditing 기술을 이용하면 마지막에 데이터를 생성 및 수정한 사람과 시간을 추적할 수 있게 됩니다. 우선, Auditing 기술을 사용하게 위해, SpringApplication.class에 다음과 같은 어노테이션을 지정해줘야 합니다. @EnableJpaAuditing public class ExerciseApplication { public static void main(String[] args) { SpringApplication.run(ExerciseApplication.class, args); } } 다음으로 생성시간, 수..

Java/Spring 2023.11.24

[Spring] DTO, VO 이 둘의 차이에 대해 알아보자

저는 DTO랑 VO를 구분하지 않고 비슷한 맥락으로 보고 있었는데요. 이 들의 차이를 구분하고 어떤 상황에서 DTO를 도입하고, VO를 도입해야 하는지 하나씩 알아보도록 하겠습니다. DTO(Data Transfer Object) 순수하게 데이터를 담아 계층 간으로 전달하는 객체, Getter/Setter 메서드만을 가집니다. "데이터 전달"이 주목적입니다. 이를 통해 보내는 쪽에서 setter를 이용하여 값을 담아 전달하고, 받는 쪽에서는 getter를 이용하여 값을 꺼내서 쓰게 됩니다. setter의 경우, 변조 가능성이 있기 때문에(setter 사용 지양) 생성자로 값을 넣어주면, 전달하는 과정에서 변조가 불가능합니다. VO(Value Object) DTO(Data Transfer Object)와는 ..

Java/Spring 2023.11.17

[Spring] 웹 애플리케이션과 영속성 관리

스프링 컨테이너의 기본 전략 스프링 컨테이너는 트랜잭션 범위의 영속성 컨텍스트 전략 사용 트랜잭션을 시작할 때 영속성 컨텍스트(Persistance Context)를 생성하고 트랜잭션이 끝나면 영속성 컨텍스트를 종료합니다. 핵심 비즈니스 로직을 담당하는 Service 클래스에서 @Transactional 어노테이션을 통해 트랜잭션을 시작하게 되고, 서비스보다 상위 계층에 있는 Layer는 준영속 상태가 됩니다. 준영속 상태가 뭔지 설명드리기 전에 엔티티 생명주기에 대해 간략하게 설명드리겠습니다. 엔티티 생명주기 비영속(new/transient): new 키워드로 객체를 생성만 한 상태 (영속성 컨텍스트에서 관리 X, 1차 캐시, 변경 감지 등의 기능 적용 X) 영속(managed): 영속성 컨텍스트에 의..

Java/Spring 2023.11.14

[Java] EnumSet에 대해서

캡스톤디자인2 Allercheck 프로젝트에서 핵심 기능을 구현하기 위해 EnumSet을 활용하였습니다. 핵심 기능의 일부를 위해 EnumSet을 적용하였는데, 간략하게 설명드리자면 데이터베이스에 음식에 관한 알러지 정보를 저장하기 위해 사용하였습니다. JPA에서는 EnumSet 자료 구조에 JSON 직렬화, 역직렬화를 제공하지 않아 직접 이 기능을 구현해야 하는 번거로움이 있었습니다. 이제 EnumSet이 무엇이고 왜 사용하는지에 대해 설명드리겠습니다. EnumSet EnumSet은 Enum 클래스와 함께 작동하는 특수한 Set Collection입니다. Set 인터페이스를 구현하고 AbstractSet에서 확장됩니다. 인스턴스를 생성할 수 있는 여러 정적 팩토리 메서드가 포함된 추상 클래스입니다. A..

Java/Java Concept 2023.11.13

[Design Pattern] Template Method Pattern(템플릿 메소드 패턴)이란

템플릿 메소드 패턴이란 알고리즘의 구조를 메소드에 정의하고, 하위 클래스에서 알고리즘 구조의 변경 없이 알고리즘을 재정의 하는 패턴입니다. 알고리즘이 단계별로 나누어지거나, 같은 역할을 하는 메소드지만 여러 곳에서 다른 형태로 사용이 필요한 경우 유용한 패턴입니다. 토비의 스프링에서는 다음과 같이 정의합니다. 상속을 통해 슈퍼클래스의 기능을 확장할 때 사용하는 가장 대표적인 방법. 변하지 않는 기능은 슈퍼클래스에 만들어 두고 자주 변경되며 확장할 기능은 서브클래스에 만들도록 한다. 조건 클래스는 추상(abstract) 클래스로 만들어야 됩니다. 단계를 진행하는 메소드는 수정이 불가능하도록 final 키워드를 추가합니다. 각 단계에서 외부는 막고, 자식들만 활용할 수 있도록 protected로 선언합니다...

Java/Design Pattern 2023.11.06

[Design Pattern] Singleton Pattern(싱글톤 패턴)이란

오늘은 메모리 낭비를 방지할 수 있는 디자인 패턴인 싱글톤 패턴에 대해 알아보겠습니다. Singleton Pattern 애플리케이션이 시작될 때, 생성자가 여러 차례 호출되더라도 실제로 생성되는 객체는 하나이고 최초 생성 이후에 호출된 생성자는 최초의 생성자가 생성한 객체를 리턴하는 패턴 즉, 처음에 생성한 인스턴스를 지속적으로 사용하는 패턴입니다 Java에서는 생성자를 Private으로 선언하고 다른 곳에서 생성하지 못하도록 만들고, getInstance() 메서드를 통해 받아서 사용하도록 구현 주로, 데이터베이스에서 Connection Pool, Thread Pool처럼 공통된 객체를 여러개 생성해서 사용하는 상황에서 사용합니다. 이제 장단점에 대해 설명드리겠습니다. 장점 객체를 생성할 때 마다 메모..

Java/Design Pattern 2023.11.03

[Design Pattern] Adapter Pattern(어댑터 패턴)이란

Adapter Pattern에 대해 알아보기 전, Design Pattern(디자인 패턴)에 대해 간단하게 설명드리겠습니다. 디자인 패턴이란 소프트웨어의 재사용성, 호환성, 유지보수성을 보장하기 위한 설계 기법이며 아이디어입니다. 필수적인 요소는 아니지만, 아는 것과 모르는 것은 차이가 크다고 생각합니다 (필요에 따라 가져다 쓸 수 있어야 된다고 생각합니다) Adapter Pattern 호환되지 않는 인터페이스들을 연결하는 디자인 패턴 기존의 클래스를 수정하지 않고도 특정 인터페이스를 필요로 하는 코드에서 사용 가능 서로 다른 인터페이스를 가진 클래스들이 상호작용할 수 있기에 코드의 재사용성 증대 Component Target(타겟): Client가 직접적으로 호출하는 interface Adaptee(어..

Java/Design Pattern 2023.10.31

[Spring] Filter, Interceptor, ArgumentResolver

비즈니스 로직과 인증 로직을 분리하기 위한 3가지 요소가 있습니다. 이 3가지 요소는 이들은 모두 공통된 인증 로직을 처리합니다. 서비스 규모가 커진다면 보안 체크를 매 요청 때마다 해줘야 합니다. 그래서 이들을 확실하게 구분하고 중복 로직을 없애려고 합니다. Filter, Interceptor, AOP가 있는데, AOP는 매우 방대한 내용이라서, Interceptor와 약간의 차이가 있지만 비슷한 역할을 담당하는ArgumentResolver에 대해서 설명드리겠습니다. 전반적인 흐름도 다음 사진과 같이 Client가 HTTP Request를 보냈을 때, Spring Container 영역 밖에 있는 Filter(Servlet Container 영역)를 거치고 DispatcherServlet에서 해당 요청..

Java/Spring 2023.10.15

[Spring] Nginx를 이용하여 http(80 Port)로 들어오는 요청을 springboot(8080 Port)로 Redirect 시키기

Nginx의 Reverse Proxy를 활용하여 80포트로 들어오는 요청을 8080포트로 redirect 시키는 실습을 해보려고 합니다. Springboot Root Directory Dockerfile Nginx Install && redirect(80 -> 8080) 설정 brew install nginx mkdir ./nginx && touch nginx/default.conf default.conf (Reverse Proxy 설정) upstream app { server spring-app:8080; # WAS 컨테이너의 이름 } server { listen 80; location / { proxy_pass http://app; 80포트로 들어온 요청을 8080포트로 전달 proxy_set_hea..

Java/Spring 2023.09.27