전체 글

테크 블로그입니다. https://github.com/heebum99
외부설정과 프로필외부 설정 사용 - Environment스프링은 Environment를 활용해서 더 편리하게 외부 설정을 읽는 방법을 제공한다.스프링이 지원하는 다양한 외부 설정 조회 방법Environment@Value - 값 주입@ConfigurationProperties - 타입 안전한 설정 속성 @Slf4jpublic class MyDataSource { private String url; private String username; private String password; private int maxConnection; private Duration timeout; private List options; public MyDataSource(String ur..
외부설정과 프로필외부 설정이란하나의 애플리케이션을 여러 다른  환경에서 사용해야할 때가 있다.개발 환경 : 개발이 잘 진행되고 있는지 내부에서 확인하는 용도개발 서버 -> 개발 DB운영 환경 : 실제 고객에게 서비스하는 용도운영 서버 -> 운영 DB각 환경에 따라서 다른 설정 값이 존재한다.ex) 서로 다른 DB를 사용하기에 DB 설정 값(url ...)이 존재한다. 환경에 따라 값을 설정하는 방법환경에 따라 변하는 설정 값을 내부에 포함하는 방법환경에 따라 빌드를 여러번 해야한다.빌드 결과물이 서로 다르고 유연성이 떨어진다.실행 시점에 외부 설정값을 주입하는 방법 (주로 사용하는 방식)환경과 무관하게 하나의 빌드 결과물을 생성설정 값은 각 환경에 맞게 실행 시점에 외부에서 주입한다.  실행 시점에 외부..
·Git
여러 Git Repository를 하나로 합치기git subtree를 사용하는 방식git subtree : Git의 서브모듈과 비슷하며 서브모듈보다 간편하게 여러 Git 레포지토리의 내용을 병합하고 관리할 수 있는 도구다.특정 디렉토리에 다른 Git 레포지토리를 서브트리 형식으로 추가하고, 여러 Git 레포지토리의 커밋 히스토리를 하나의 레포지토리에 통합할 때 사용한다.다른 레포지토리의 이력을 유지하면서 그 레포지토리의 내용을 서브디렉토리로 병합할 수 있기에 여러 레포지토리의 변경 사항을 하나의 레포지토리에서 관리하고자 할 때 유용레포지토리 병합 시 자동으로 새로운 커밋을 생성한다.ex) Add 'JavaSpringBoot/' from commit '232be42d...서브모듈과 달리 병합 후에도 독립적..
자동 구성예제 만들기JdbcTemplate을 사용한 회원 데이터를 DB에 보관하고 관리하는 기능 개발 @Datapublic class Member { private String memberId; private String name; public Member() { } public Member(String memberId, String name) { this.memberId = memberId; this.name = name; }}회원 예제 @Configuration@Slf4jpublic class DbConfig { @Bean public DataSource dataSource() { log.info("dataSource 빈..
스프링 부트 스타터와 라이브러리 관리스프링 부트는 라이브러리들을 편리하게 사용할 수 있는 기능을 제공한다.외부 라이브러리 버전 관리스프링 부트 스타터 제공 dependencies { //1. 라이브러리 직접 지정 //스프링 웹 MVC implementation 'org.springframework:spring-webmvc:6.0.4' //내장 톰캣 implementation 'org.apache.tomcat.embed:tomcat-embed-core:10.1.5' //JSON 처리 implementation 'com.fasterxml.jackson.core:jackson-databind:2.14.1' ...}...라이브러리 직접 선택 build.gradle 예시..
내장 톰캣WAR 배포 방식의 단점WAR 배포 방식의 단점WAS를 별도로 설치해야 한다.애플리케이션 코드를 WAR로 빌드해야 한다.빌드한 WAR 파일을 WAS에 배포해야 한다.개발 환경 설정이 복잡하다. 이 문제를 해결하기 위해 외장 서버를 라이브러리를 통해 내장 서버로 제공한다.내장 톰캣 - 서블릿public class EmbedTomcatServletMain { public static void main(String[] args) throws LifecycleException { System.out.println("EmbedTomcatServletMain.main"); //톰캣 설정 Tomcat tomcat = new Tomcat(); Connec..
웹 서버와 서블릿 컨테이너웹 서버와 스프링 부트 소개웹 서버 전통적인 방식 vs 최근 방식전통적인 방식 - 서버에 WAS를 설치하고 WAS에서 동작하도록 서블릿 스펙에 맞춰 코드 작성 -> WAR 형식으로 빌드 -> war 파일을 WAS에 전달해서 배포WAS 기반위에 개발하고 실행해야 하며 IDE 개발 환경에서도 WAS와 연동해야 하는 추가 설정이 필요하다.최근 방식 - 스프링 부트가 내장 톰캣(WAS)을 포함 -> 코드 작성 -> JAR 빌드 후 실행하면 WAS도 함께 실행WAS 설치, IDE 개발 환경에서 WAS와 연동하는 일을 수행하지 않아도 된다.톰캣 설치윈도우 사용자 톰캣 실행 / 종료톰캣폴더/bin 폴더로 이동실행 : startup.bat종료 : shutdown.bat 톰캣 실행 로그 위치톰캣..
스프링 부트스프링 부트 : 스프링 프레임워크를 편리하게 사용할 수 있도록 지원해주는 도구이다.시작을 위해 복잡한 설정 과정을 해결해준다. 스프링 부트의 핵심 기능 5가지WAS - 톰켓같은 웹 서버를 내장해서 별도의 웹 서버를 설치하지 않아도 된다.라이브러리 관리 - 손쉬운 빌드 구성을 위한 스타터 종속성 제공, 라이브러리 버전 자동 관리자동 구성 - 프로젝트 시작에 필요한 스프링과 외부 라이브러리의 빈을 자동 등록외부 설정 - 환경에 따라 달라져야 하는 외부 설정 공통화프로덕션 준비 - 모니터링을 위한 메트릭, 상태 확인 기능 제공이제는 스프링 프레임워크와 스프링 부트를 함께 사용하는 것은 필수!!스프링 부트가 너무 많은 편의 기능을 제공하기에 필수로 사용해야 한다.스프링 부트는 스프링 프레임워크를 쉽게..
스프링 AOP 실무 주의사항프록시와 내부 호출 - 문제스프링은 프록시 방식의 AOP를 사용한다.AOP 적용 시 스프링은 실제 객체 대신 프록시를 스프링 빈으로 등록한다.스프링은 의존관계 주입 시 항상 프록시 객체를 주입한다.AOP를 적용하기 위해서 항상 프록시를 통해서 실제 객체(Target)을 호출해야 한다.프록시에서 어드바이스를 호출하고 이후 실제 객체를 호출한다.프록시를 거치지않고 실제 객체를 직접 호출하면 AOP가 적용되지 않는다.실제 객체 내부에서 메소드 호출이 발생하면 프록시를 거치지 않고 실제 객체를 직접 호출하는 문제가 발생한다. @Slf4j@Componentpublic class CallServiceV0 { public void external() { log.info("..
스프링 AOP 실전 예제예제 만들기@Repositorypublic class ExamRepository { private static int seq = 0; /** * 5번에 1번 실패하는 요청 */ public String save(String itemId) { seq++; if (seq % 5 == 0) { throw new IllegalStateException("예외 발생"); } return "ok"; }}Repository 예제save()에서 요청이 5번 중 1번 예외 발생으로 실패한다. @Service@RequiredArgsConstructorpublic class ExamService ..
h2boom
희스토리