Archive: 2021

0

Spring Boot 게시판 만들기 17 - 외부로부터 설정 받기(property)

17. 외부로부터 설정 받기(property)Github에 프로젝트를 올릴때 데이터 베이스 접속 연결과 같은 민감한 정보는 다른 사람이 열람해서는 안되는 정보라 형상관리에서 제외한 상태로 올리게 된다. .gitignore **/application-mysql.yml**/application-mysql.properties 데이터베이스 접속을 위한 properties 만들기application-mysql.properties spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driverspring.datasource.url=jdbc:mysql://localhost:3306/{테이블}serverTimezone=UTC&characterEncoding=UTF-8spring.datasource.username={Username}spring.datasource.password={Password} TransactionManagementConfigurer은 Spring에서 데티어베이스 연결을 지원한다. DBConfig.java

0

스프링 핵심 원리 이해 - 객체 지향 원리 적용

목차 Post not found: spring-boot/spring-core/basic/basic2 객체 지향 설계 5원칙 SOLID DIP 원칙 위반 - 추상화와 구체화 둘다 의존MemberServiceImpl 클래스는 MemberRepository 인터페이스를 의존하면서 구현 클래스인 MemoryMemberRepository도 의존하고 있다. public class MemberServiceImpl implements MemberService{ // MemberServiceImpl 클래스는 MemberRepository 인터페이스와 구현체인 MemoryMemberRepository 둘다 의존하고 있다. private final MemberRepository memberRepository = new MemoryMemberRepository(); @Override public void join(Member member) { memberRepository.save(member); } @Override public Member findMember(Long memberId) { return memberRepository.findById(memberId); }} OrderServiceImpl 클래스는 MemberRepository 인터페이스와 DiscountPolicy 인터페이스를 의존하면서 구현 클래스인 MemoryMemberRepository 와 RateDiscountPolicy 를 의존하고 있다. 추상화와 구체화 둘다 의존하는 문제가 있다.–> DIP 위반 DIP의 원칙을 지키기 위해 의존 class내에서 구현 클래스를 가져오는 부분을 삭제하게 되면 객체가 존재하지 않아서 nullPointException이 발생한다. public class OrderServiceImpl implements OrderService { // OrderServiceImpl 클래스는 MemberRepository 인터페이스와 구현체인 MemoryMemberRepository // DiscountPolicy 인터페이스와 구현체인 RateDiscountPolicy 를 의존하는 문제점이 있다. private final MemberRepository memberRepository = new MemoryMemberRepository(); private final DiscountPolicy discountPolicy = new RateDiscountPolicy(); @Override public Order createOrder(Long memberId, String itemName, int itemPrice) { Member member = memberRepository.findById(memberId); int discountPrice = discountPolicy.discount(member, itemPrice); return new Order(memberId, itemName, itemPrice, discountPrice); }}

0

Spring Boot - 독립적으로 실행 가능한 JAR

독립적으로 실행 가능한 JAR앱을 어딘가에 배포하거나 도커 이미지로 만들거나 하기 위해서는 jar패키지로 패키징한 후 jar파일을 실행하는게 유용하다. jar파일 생성mvn package mvn pakcage명령어를 통해 앱을 jar파일로 생성한다. jar파일이 생성됨을 확인할 수 있다. jar파일 안에는 앱을 실행하기 위한 의존성(library)들이 전부 다 포함되어 있다. jar 파일 실행java -jar springinit-1.0-SNAPSHOT.jar

0

Spring Boot - 내장 웹 서버 응용 2부(HTTPS와 HTTP2)

내장 웹 서버 응용 2부 : HTTPS와 HTTP2https를 사용하기 위해서는 키스토어가 필요하다. 키스토어 생성# 저는 줄 바꿈 문자 해결 했습니당 ^^keytool -genkey \ -alias tomcat \ -storetype PKCS12 \ -keyalg RSA \ -keysize 2048 \ -keystore keystore.p12 \ -validity 4000 위 명령어를 사용하여 키 스토어를 생성할 수 있다. 키 저장소 비밀번호 입력:새 비밀번호 다시 입력:이름과 성을 입력하십시오. [Unknown]: dongwoo yang조직 단위 이름을 입력하십시오. [Unknown]: island조직 이름을 입력하십시오. [Unknown]: ceo구/군/시 이름을 입력하십시오? [Unknown]: seongbuk시/도 이름을 입력하십시오. [Unknown]: seoul이 조직의 두 자리 국가 코드를 입력하십시오. [Unknown]: krCN=dongwoo yang, OU=island, O=ceo, L=seongbuk, ST=seoul, C=kr이(가) 맞습니까? [아니오]: 예 해당 질문들이 나오는데, 마지막에 “네” 혹은 “yes”를 하게 되면 무한루프에 빠지게 된다….. 예라고 꼭!!!! 적어주도록…. key를 생성하게 된 다음에 git을 사용하고 있는 중이라면 꼭!!! gitignore에 추가하자!!! 키스토어 사용을 위한 세팅해주기

0

Spring Boot - 내장 웹 서버 응용 1부(컨테이너와 포트)

내장 웹 서버 응용 1부 : 컨테이너와 포트https://docs.spring.io/spring-boot/docs/current/reference/html/howto-embedded-web-servers.html에 다른 서블릿 컨테이너를 사용하는 방법이 적혀져 있다. tomcat 빼기 일단, spring-boot-starter-web에 적재되어 있는 tomcat을 뺄 필요가 있다. <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> <exclusions> <exclusion> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-tomcat</artifactId> </exclusion> </exclusions></dependency> 톰켓을 뺀 후 아무것도 추가하지 않으면 웹 어플리케이션으로 작동하지 않고 어플리케이션으로 작동하기 때문에 그냥 종료된다. 다른 컨테이너 추가하기Jetty

0

Spring Boot - 내장 웹 서버 이해

내장 웹 서버 이해내장 서버를 스프링 부트 없이 만들어 보기 springbootgetttingstarted public class Application { public static void main(String[] args) throws LifecycleException { // 톰캣 만들기 Tomcat tomcat = new Tomcat(); tomcat.setPort(8888); Context context = tomcat.addContext("/", "/"); // servlet 만들기 HttpServlet servlet = new HttpServlet(){ @Override // get요청에 관한 메소드 protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { // response 객체의 writer객체를 반환받아 // 응답으로 전해줄 servlet을 작성해준다. PrintWriter writer = resp.getWriter(); writer.println("<html><head><title>"); writer.println("Hey, Tomcat"); writer.println("</title></head>"); writer.println("<body><h1>Hello Tomcat</h1></body>"); writer.println("</html>"); } }; String servletName = "helloServlet"; // 톰켓에 서블릿을 추가해준 후 tomcat.addServlet("/", servletName, servlet); // /hello url과 해당 서블릿을 매핑 시켜준다. context.addServletMappingDecoded("/hello", servletName); tomcat.getConnector(); tomcat.start(); tomcat.getServer().await(); }} tomcat9부터는 tomcat.start()를 하기 전에 tomcat.getConnector()를 해야 실행이 된다. tomcat 객체를 생성 servlet 객체를 생성했다. 결과 스프링 부트에서는 위와 같은 설정을 AutoConfiguration에서 자동으로 잡아준다.

0

Spring Boot - 자동 설정 만들기 1부

자동 설정 만들기 2부EnableAutoConfiguration이 불러오는 같은 Bean 무시하기 maplespringbootstarter 프로젝트 @Configurationpublic class HolomanConfiguration { @Bean @ConditionalOnMissingBean public Holoman holoman(){ Holoman holoman = new Holoman(); holoman.setHowLong(5); holoman.setName("maple"); return holoman; }} @ConditionalOnMissingBean을 사용하면 해당 Bean이 없는 경우에만 EnableAutoConfiguration을 통해 Bean이 추가 된다. 결과2020-03-15 21:31:49.936 INFO 67228 --- [ main] com.example.Application : Starting Application on yangdong-uui-MacBookPro.local with PID 67228 (/Users/dongwoo-yang/dev/study/spring/everyday_spring/chapter3/ch3_5/springbootgettingstarted/target/classes started by dongwoo-yang in /Users/dongwoo-yang/dev/study/spring/everyday_spring/chapter3/ch3_5/springbootgettingstarted)2020-03-15 21:31:49.938 INFO 67228 --- [ main] com.example.Application : No active profile set, falling back to default profiles: default2020-03-15 21:31:50.581 INFO 67228 --- [ main] com.example.Application : Started Application in 0.937 seconds (JVM running for 1.598)Holoman{name='동장군', howLong=60}Process finished with exit code 0 springbootgetttingstarted프로젝트의 Bean이 출력됨을 확인할 수 있다. application.properties를 이용한 방법

0

Spring Boot - 자동 설정 만들기 1부

자동 설정 만들기 1부 Xxx-Spring-Boot-Autoconfigure 모듈: 자동 설정 Xxx-Spring-Boot-Starter 모듈: 필요한 의존성 정의 그냥 하나로 만들고 싶을 때는?Xxx-Spring-Boot-Starter spring-boot-starter 만들기 프로젝트 명 : maplespringbootstarter ArtifactId : maple-spring-boot-starter 의존성 추가 maplespringbootstarter 프로젝트 <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-autoconfigure</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-autoconfigure-processor</artifactId> <optional>true</optional> </dependency></dependencies><dependencyManagement> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-dependencies</artifactId> <version>2.0.3.RELEASE</version> <type>pom</type> <scope>import</scope> </dependency> </dependencies></dependencyManagement>

0

Spring Boot - @SpringBootApplication 알아보기

@SpringBootApplication@SpringBootApplication 은 Spring Boot 애플리케이션의 진입점으로 사용되는 어노테이션으로, Spring Boot 설정 및 실행에 필요한 여러 기능을 한 곳에서 제공합니다. @SpringBootApplication 은 크게 3가지 어노테이션으로 이루어져 있습니다. @ComponentScan에서 1차적으로 @Bean을 읽어들인 후 @EnableAutoConfiguration에서 2차적으로 @Bean을 읽어들인다. @SpringBootConfiguration @SpringBootConfiguration은 기존의 Configuration과 비슷하다. @ComponentScan 기본 값은 @SpringBootApplication 가 작성된 패키지와 하위 패키지의 모든 @Component 와 @Bean 을 찾아 Spring Bean 으로 등록한다. @EnableAutoConfiguration Spring Boot의 핵심 기능인 자동 설정을 활성화합니다. 라이브러리와 설정을 기반으로 필요한 Bean 들을 설정합니다. 즉 springboot는 Bean을 두번 등록하는 작업을 거친다. @ComponentScan@ComponentScan은 Application.class에 있다. 위 그림에서는 a와 b 패키지의 경우는 ComponentScan의 대상이 되나 maple 패키지의 경우 ComponentScan의 대상이 되지 않는다.

0

Spring Boot의 의존성

Spring Boot의 의존성pom.xml파일에 의존성 추가<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId></dependency> 스프링이 제공하는 의존성 관리 기능 덕분에의존성 정의시 version을 따로 명시하지 않아도 적절한 version을 가져온다. 의존성 상속 관계spring-boot-starter-parent<parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.2.5.RELEASE</version> <relativePath/> <!-- lookup parent from repository --></parent> spring-boot-dependencies

0

Spring-JWT(JSON Web Token) - 1. JWT 알아보기

1. JWT(JSON Web Token) 알아보기목차 Spring-JWT(JSON Web Token) - 4. JWT 다루기 Spring-JWT(JSON Web Token) - 3. Spring Security 적용하기 Spring-JWT(JSON Web Token) - 2. 회원가입 Spring-JWT(JSON Web Token) - 1. JWT 알아보기 참고 https://jwt.io/ JWT 란? JWT는 JSON Web Token의 약자로 사용자 정보와 데이터 속성과 같은 Claim 정보를 JSON 을 이용해 표현한 Web TokenJWT는 Token내에 필요한 모든 정보를 가지고 전달해주는 자가수용적인 특징이 있다 JWT는 Header, Payload, Signature 세가지로 구성돼 있다. 각 부분은 Json 형태 로 이뤄져 있으며 base64로 인코딩 돼 .로 나뉘어 구분된다.

0

Spring Core - BeanDefinition

목차 Spring Core - 의존성 주입 방식 Spring Core - 컴포넌트 스캔과 의존성 주입 Spring Core - BeanDefinition Spring Core - 스프링 빈 Spring Core - 스프링 컨테이너 생성과 Bean 등록, 의존성 주입 Spring Core - 스프링 컨테이너 BeanDefinition 스프링 컨테이너는 BeanDefinition 을 이용해 스프링 빈을 생성합니다. 스프링 컨테이너는 BeanDefinition 에 정의된 빈 메타정보를 이용해 스프링 빈을 생성합니다. 빈 메타 정보는 XML, 자바코드 등으로 작성되며 @Bean, <bean> 당 하나씩 메타정보가 생성됩니다. 스프링은 정의된 메타정보들을 읽어와 BeanDefinition 을 생성합니다. ` 당 하나씩 메타정보가 생성됩니다. --> BeanDefinitionReader서로 다른 방식으로 정의된 빈 메타정보를 BeanDefinition 으로 생성하기 위해 스프링은 다양한 BeanDefinitionReader 를 제공합니다. AnnotationConfigApplicationContext 는 AnnotatedBeanDefinitionReader 를 사용해서 AppConfig.class 를 읽고 BeanDefinition 을 생성합니다. GenericXmlApplicationContext 는 XmlBeanDefinitionReader 를 사용해서 appConfig.xml 설정 정보를 읽고 BeanDefinition 을 생성합니다. 새로운 형식의 설정 정보가 추가되면, XxxBeanDefinitionReader를 만들어서 BeanDefinition 을 생성하면 된다.

0

Spring Core - 스프링 컨테이너 생성과 Bean 등록, 의존성 주입

목차 Spring Core - 의존성 주입 방식 Spring Core - 컴포넌트 스캔과 의존성 주입 Spring Core - BeanDefinition Spring Core - 스프링 빈 Spring Core - 스프링 컨테이너 생성과 Bean 등록, 의존성 주입 Spring Core - 스프링 컨테이너 스프링 컨테이너 생성 과정과 Bean 등록, 의존성 주입스프링 실행시 스프링 컨테이너가 생성되면 전달 받은 설정 정보를 이용해 스프링 빈을 생성 및 등록 합니다. 빈 등록이 완료된 후에는 설정 정보를 참고해 의존관계를 주입합니다. 이렇게 스프링은 빈을 생성하고 의존관계를 주입하는 관계가 나눠져 있습니다. 하지만 자바 코드로 빈을 등록하게 되면 객체의 생성자를 호출하면서 의존관계 주입까지 한번에 이뤄지게 됩니다. 1. 스프링 컨테이너 생성스프링 컨테이너를 생성할 때는 구성 정보를 지정해주어야 합니다. 구성 정보는 자바 클래스나 xml 을 이용해 정의할 수 있습니다. 스프링 컨테이너 생성시 설정 정보를 이용해 스프링 컨테이너를 생성합니다. 아래에서는 자바 클래스 AppConfig.class 를 설정 정보로 이용해 스프링 컨테이너를 생성합니다. //스프링 컨테이너 생성ApplicationContext applicationContext = new AnnotationConfigApplicationContext(AppConfig.class);

0

Spring Core - 스프링 빈

목차 Spring Core - 의존성 주입 방식 Spring Core - 컴포넌트 스캔과 의존성 주입 Spring Core - BeanDefinition Spring Core - 스프링 빈 Spring Core - 스프링 컨테이너 생성과 Bean 등록, 의존성 주입 Spring Core - 스프링 컨테이너 스프링 빈 스프링 IoC 컨테이너에 의해 생성되고 관리되는 객체를 보고 스프링 빈이라 부릅니다. Bean 객체는 스프링 컨테이너에 의해 생성 및 관리되며 일반적으로 싱글톤 객체로 생성됩니다. Bean 끼리 의존관계가 있을 경우 의존성 주입을 통해 사용할 수 있습니다. 스프링 컨테이너에 객체를 Bean 으로 등록하는 방법 XML 에 직접 등록하는 방법 @ComponentScan 을 이용해 자동적으로 Bean 을 등록하는 방법 @Configuration 과 @Bean 을 이용하여 직접적으로 등록을 하면 된다. Bean 어노테이션으로 정의할 때는 @Configuration 가지고 있는 클래스 안에 정의해야 한다. @Configuration 안에서 @Bean 을 사용해야 싱글톤을 보장 받을 수 있습니다. XML 을 이용해 Bean 등록하기최근 스프링 부트의 등장으로 xml 을 이용해 스프링을 설정하는 방법은 잘 사용하지 않는 방식입니다. xml 을 이용해 스프링 컨테이너를 설정하는 것의 장점은 컴파일 없이 빈 설정 정보를 변경할 수 있다는 점이다.