Archive: 2021

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 - 자동 설정 이해

Spring Boot - 자동 설정 이해 @SpringBootApplication 은 크게 3가지 어노테이션으로 이루어져 있다. @ComponentScan에서 1차적으로 @Bean을 읽어들인 후 @EnableAutoConfiguration에서 2차적으로 @Bean을 읽어들인다. @SpringBootConfiguration @SpringBootConfiguration은 기존의 Configuration과 비슷하다. @ComponentScan @ComponentScan 은 value 혹은 basePackages 속성을 이용해 component scan 을 시작하는 위치를 설정한다. 기본 값은 @ComponentScan 가 작성된 하위 패키지의 모든 @Component 와 @Bean 을 찾아 Spring Bean 으로 등록한다. @EnableAutoConfiguration Spring Boot가 제공하는 클래스를 Spring Bean으로 등록하는 방법이다. 즉 springboot는 Bean을 두번 등록하는 작업을 거친다. @ComponentScan@ComponentScan은 Application.class에 있다. 위 그림에서는 a와 b 패키지의 경우는 ComponentScan의 대상이 되나 maple 패키지의 경우 ComponentScan의 대상이 되지 않는다. @ComponentScan에서 Scan 대상

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 - BeanDefinition

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

0

Spring - 스프링 컨테이너 생성과 Bean 등록

목차 Spring - 의존성 주입 방식 Spring - 스프링 컨테이너 생성과 Bean 등록 Spring - 스프링 빈 Spring - 스프링 컨테이너 스프링 컨테이너 생성 과정과 Bean 등록 과정스프링 컨테이너를 생성할 때는 구성 정보를 지정해주어야 한다. 구성 정보는 클래스나 xml 을 이용해 정의할 수 있습니다. //스프링 컨테이너 생성ApplicationContext applicationContext = new AnnotationConfigApplicationContext(AppConfig.class); 스프링 컨테이너 생성스프링 컨테이너 생성시 설정 정보를 이용해 스프링 컨에티너를 생성합니다. 아래에서는 AppConfig.class 를 설정 정보로 이용해 스프링 컨테이너를 생성합니다. 스프링 빈 등록

0

Spring - 스프링 빈

목차 Spring - 의존성 주입 방식 Spring - 스프링 빈 Post not found: spring/spring-core/spring-bean-container 스프링 빈 스프링 IoC 컨테이너에 의해 생성되고 관리되는 객체를 보고 스프링 빈이라 부릅니다. Bean 객체는 스프링 컨테이너에 의해 생성 및 관리되며 일반적으로 싱글톤 객체로 생성됩니다. Bean 끼리 의존관계가 있을 경우 의존성 주입을 통해 사용할 수 있습니다. 스프링 컨테이너에 객체를 Bean 으로 등록하는 방법 XML 에 직접 등록하는 방법 @Configuration 과 @Bean 을 이용하여 직접적으로 등록을 하면 된다. Bean 어노테이션으로 정의할 때는 @Configuration 가지고 있는 클래스 안에 정의해야 한다. @Configuration 안에서 @Bean 을 사용해야 싱글톤을 보장 받을 수 있습니다. Component Scan을 이용하는 방법 Component 어노테이션이 붙어있는 클래스를 찾아서 Bean으로 등록해준다.

0

Spring - 스프링 빈

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

0

Spring - Spring 컨테이너

목차 Spring - 의존성 주입 방식 Spring - 스프링 컨테이너 생성과 Bean 등록 Spring - 스프링 빈 Spring - Spring 컨테이너 Spring 컨테이너와 IoC(Inversion of Control)객체의 생성, 객체간의 의존성 과 같은 프로그램의 흐름 을 개발자가 아니라 프레임워크나 외부 컨테이너에가 관리 해주는 것을 의미합니다. 즉, 프로그램에 대한 제어권이 개발자가 아니라 프레임워크나 외부 컨테이너에서 관리가 됩니다. Spring 의 핵심요소인 Spring 컨테이너는 객체의 생성과 관리, 의존성 주입, 생명주기등을 해주기 때문에 IoC 컨테이너 라고 불립니다. Spring 컨에티너의 주요 기능Spring 컨테이너는 객체를 생성하고 컨테이너에 등록합니다. 이때, Spring 컨테이너에 등록된 객체들을 Spring Bean 이라 부르고 컨테이너는 등록된 Bean 의 생성, 초기화, 소멸까지의 전체적인 생명주기를 관리합니다. Spring Bean 들이 생성된 후 Spring 컨테이너는 객체간의 관계를 확인 후 설정에 따라 의존성을 주입합니다. Bean 으로 등록되지 않은 객체에 대해서는 의존성 주입이 이뤄지지 않습니다.