전체 글
-
외부 설정 3 - 커맨드 라인 인수스프링/스프링부트 2023. 9. 30. 15:20
커맨드 라인 인수는 애플리케이션 실행 시점에 외부 설정값을 main(args) 메서드의 args 파라미터로 전달하는 방법이다. java -jar app.jar dataA dataB와 같이 사용된다. 필요한 데이터를 마지막 위치에 스페이스로 구분해서 전달한다. 위의 방법에서는 dataA, dataB 2개의 문자가 args에 전달된다. 사진의 동그라미 부분에 dataA, dataB를 넣어준다. 이 때, 한 칸 띄어쓰기 하는 것은 꼭 필요하다. @Slf4j public class CommandLineV1 { public static void main(String[] args) { for (String arg : args) { log.info("arg {}", arg); } } } 테스트코드로 args를 하나씩..
-
외부 설정 2 - 자바 시스템 속성스프링/스프링부트 2023. 9. 30. 14:46
자바 시스템 속성은 실행한 JVM 안에서 접근 가능한 외부 설정이다. 추가로 자바가 내부에서 미리 설정해두고 사용하는 속성들도 있다. 자바 시스템 속성은 아래처럼 자바를 실행할 때 사용된다. 예) java -Durl=dev -jar app.jar -D 옵션을 통해서 key=value 형식으로 주면 된다. 여기서는 url이라는 key 값에 dev라는 value를 넣어줬다. -D 옵션이 jar 보다 앞에 위치해야 한다. 사진 순서에 따라 설정을 해주면 Test 코드 @Slf4j public class JavaSystemProperties { public static void main(String[] args) { Properties properties = System.getProperties(); for (..
-
외부 설정 1 - OS 환경 변수스프링/스프링부트 2023. 9. 30. 14:31
OS 환경 변수는 해당 OS를 사용하는 프로그램에서 읽을 수 있는 설정값이고, 다른 외부 설정과 비교해서 사용 범위가 가장 넓다. window에서 환경 변수 설정을 수정하면 시스템의 환경 변수 설정을 수정할 수 있다. @Slf4j public class OsEnv { public static void main(String[] args) { Map envMap = System.getenv(); // 전체 환경 변수를 Map으로 조회 for (String key : envMap.keySet()) { log.info("env {}={}", key, System.getenv(key)); } } } System.getenv()로 전체 환경 변수를 Map으로 조회하고 출력해보면 아래처럼 나온다. 이렇게 환경 변수들..
-
외부 설정이란?스프링/스프링부트 2023. 9. 30. 14:18
애플리케이션이 사용되고 있을 때, 개발이 잘 진행되고 있는지, 운영이 잘 되고 있는지 확인하는 환경이 있다. 개발 환경 : 개발 서버, 개발 DB 사용 운영 환경 : 운영 서버, 운영 DB 사용 개발DB와 운영DB에 접근하려면 서로 다른 url을 사용해야 한다는 문제점이 있다. 문제점을 해결하는 가장 단순한 방법은 각각의 환경에 맞게 애플리케이션을 빌드하는 방법이다. 하지만 이러한 방법은 환경에 따라서 빌드를 여러번 해야하기 때문에 좋은 방법이 아니다. 다른 빌드 결과를 사용하기 때문에 예상치 못한 문제가 발생할 수 있기 때문이다. 또한, 각 환경에 맞추어 최종 빌드가 나온 결과물은 다른 환경에서 사용할 수 없어서 유연성이 떨어지기에 다른 환경이 필요한 그곳에 맞춘 빌드를 또 생성해야 한다. 외부 설정 ..
-
스프링 부트 자동 구성스프링/스프링부트 2023. 9. 29. 14:34
스프링 부트는 자동 구성이라는 기능을 제공하는데, 일반적으로 자주 사용하는 많은 빈들을 자동으로 구성해주는 기능이다. 물론 개발자가 직접 빈을 등록하면 개발자가 등록한 빈을 사용하고, 자동 구성은 동작하지 않는다. @Slf4j @Configuration public class DbConfig { @Bean public DataSource dataSource() { log.info("dataSource 빈 등록"); HikariDataSource dataSource = new HikariDataSource(); dataSource.setDriverClassName("org.h2.Driver"); dataSource.setJdbcUrl("jdbc:h2:mem:test"); dataSource.setUsern..
-
WAR(Web Application Archive)스프링/스프링부트 2023. 9. 27. 22:43
JAR 자바는 여러 클래스와 리소스를 묶어서 JAR(Java Archive)라고 하는 압축 파일을 만드는데 JVM 위에서 실행되거나 다른 곳에서 사용하는 라이브러리를 제공한다. WAR WAR는 Web Application Archive의 약자로 웹 애플리케이션 서버(WAS)에 배포할 때 사용하는 파일이다. JAR 파일이 JVM 위에서 실행된다면 WAR는 웹 애플리케이션 서버 위에서 실행된다. 웹 애플리케이션 서버 위에서 실행되고, HTML 같은 정적 리소스와 클래스 파일을 모두 포함하기 때문에 JAR보다 훨씬 복잡하다. WAR의 서버 사용 방법 지금은 모두 JAR만 사용하고 나도 프로젝트를 진행할 때 JAR로만 build를 했다. WAR라는 것이 있다는 것만 알고 있었는데 정확히 뭔지는 모르고 있었다. ..
-
AOP 주의사항 - 프록시와 내부 호출스프링/스프링 AOP 2023. 9. 23. 23:27
스프링은 프록시 방식의 AOP를 사용하기 때문에 AOP를 적용하기 위해서는 항상 프록시를 통해서 대상 객체를 호출해야 한다. AOP 를 적용하면 스프링은 대상 객체 대신에 프록시를 스프링 빈으로 등록한다. 스프링은 의존관계 주입시에 항상 프록시 객체를 주입하기 때문에 대상 객체를 직접 호출하는 문제는 일반적으로 발생하지 않지만 대상 객체의 내부에서 메서드 호출이 발생하면 프록시를 거치지 않고 대상 객체를 직접 호출하는 문제가 발생하는 경우가 있다. 이해하기 쉽게 코드로 설명하겠다. CallLogAspect.class @Slf4j @Aspect public class CallLogAspect { @Before("execution(* hello.aop.internalcall..*.*(..))") public..
-
재시도 AOP스프링/스프링 AOP 2023. 9. 23. 21:48
단순 조회를 할 때 아주 가끔씩 간헐적으로 예외가 발생하는 경우가 있다. 단순 조회이기 때문에 그냥 새로고침을 눌러주면 된다. 이럴 때에는 재시도 AOP를 만들어서 예외가 가끔 발생하더라도 다시 재시도를 해주면 된다. Retry 어노테이션 @Target(ElementType.METHOD) @Retention(RetentionPolicy.RUNTIME) public @interface Retry { int value() default 3; } Retry 어노테이션을 선언해줄 때 int value() default 3;이라는 변수를 선언해준다. 이 변수는 RetryAspect에서 재시도를 하는 default 값으로 사용될 것이다. RetryAspect.class @Slf4j @Aspect public cla..