Sesac 9일차

SungMin·2022년 10월 17일
0

Sesac-Java/Spring

목록 보기
5/13

Spring

개발환경 준비

  • Visual Studio Code
  • extensions : Spring Boot Dashboards, Extension Pack for Java 외

Spring 개요

● Spring Framework

  • 자바 플랫폼을 위한 오픈 소스 애플리케이션 프레임워크
  • 동적인 웹 사이트를 개발하기 위한 여러가지 서비스 제공
  • 대한민국 공공기관의 웹 서비스 개발 시 사용을 권장하고 있는 전자정부 표준프레임워크의 기반 기술로써 사용

● Spring의 특징

  • 경량 컨테이너 ( EJB – Enterprise JavaBeans)
  • 특정 인터페이스/클래스를 상속 받을 필요 없음 (POJO)
  • 확장성이 높음 (유지보수 ↑)

단축키 모음

* shift + ctrl + P
: VSC에서 (View ➡ Comment Palette) 명령 팔레트 실행.
명령 팔레트에서 추가할 팔레트들을 선택한다.

alt + shift + f
: 들여쓰기 자동 조정. 소스코드 정리

127.0.0.1
: 내 자신, 로컬 호스트

ctrl+ /
: html 해당 줄 주석 처리

ctrl + / : <!-- 주석내용 -->
: 소스코드 뒤에 주석 적기

ctrl + shift + k
: 한줄 삭제

alt + shift + 방향키 위아래
: 한줄 복사

alt + 방향키 위아래
: 한줄씩 라인 이동

Spring Boot 프로젝트 생성

HomeController.java

  • src/main/java/com/example/demo/controller/HomeController.java
package com.example.demo.controller;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;

import lombok.extern.slf4j.Slf4j;
// lombok : 스프링에서 사요하는 여러가지 번거로운 작업을 어노테이션화해서 제공한다.
// 대표적으로 로그출력을 위한 @Slf4j , @Getter , @Setter

// 스프링에서 제공하는 어노테이션(스프링을 사용하기 위해 필수인 어노테이션)
// @Controller - 요청과 응답을 처리하는 클래스에 사용
// @Service - 비즈니스 로직을 구현하기 위해 사용하는 클래스
// @Repository - 서비스에서 요청을 받아 DB를 연결 + 결과 값을 서비스에 반환하는 클래스
// @Component - 위 3가지의 어노테이션의 상위(부모) 객체

// 해당클래스를 컨트롤러 객체(빈)로 생성해서 등록해준다.
@Controller
@Slf4j
public class HomeController {
    //요청 url에 따라 해당 메소드를 실행시킨다.
    @RequestMapping("/")
    public String home(){
        // 최상위 url(127.0.0.1:8080)로 요청하게되면,
        // home.html을 출력해준다.
        log.trace("trace");
        log.debug("debug");
        log.info("info");
        log.warn("warn");
        log.error("error");
        // trace : debug보다 좀 더 상세한 정보를 나타냄.
        // debug : 프로그램을 디버깅하기 위한 정보 지정
        // info : 상태 변경과 같은 정보성 메시지를 나타냄
        // warn : 처리 가능한 문제, 향후 시스템 에러의 원인이 될수 있는 경고성 메시지를 나타냄
        // error : 요청을 처리하는 중 문제가 발생한 경우
        // if(결과값 유무체크){
            //소스가 정상적일경우 
        // }else{
            //에러발생했을 경우
        // }

        // try{ 시도
            // 내가 시도할 소스코드 작성
        // }catch (Exception e){
            // try문을 수행하다가 에러(예외)가 발생할경우 실행된다.
        // }

        //일반적으로 많은 개발자들이 System.out.println()을 사용하고있다...
        return "home";
    }

    // localhost:8080/second 혹은 127.0.0.1:8080/second 주소가 들어왔을때
    // second.html 페이지를 출력 해봅시다.
    @RequestMapping("/second")
    public String second(){
        return "second";
    }


    @RequestMapping("/login")
    public String login(String id, String pw){
        // id = 데이터베이스아이디값 이렇게 작성하면 안된다. 정석은 Service 클래스에서 작성.
        
        // 응답과 요청에대한 결과만 나타내주는게 정석
        // if(서비스에서 비지니스로직인 끝나고 결과값){
        //     로그인성공 했을경우 보여줄 페이지
        // }else{
        //     로그인 실패했을경우 보여줄 페이지
        // }
        return "login";
    }
}

Home.html

<html xmlns:th="http://www.thymeleaf.org">

    <head> 
        <!-- 해당페이지의 메타정보가 포함된다.-->
    </head>       
    <!-- 단축키 -->
    <!-- 소스코드 정리 : alt+shift+f -->
    <!-- 한줄삭제 : ctrl+shift+k -->
    <!-- 한줄복사 : alt+shit+화살표 위아래 -->
    <!-- 한줄씩 라인 이동 : alt + 화살표 위아래 -->
    <!-- 주석 단축키 : ctrl + / -->

    <body> <!-- 실제 화면에 출력될 요소를 작성-->
    <!-- 주석 -->
        <h1>Home : 홈페이지 입니다.</h1>
        <h2>h2</h2>
        <h3>h3</h3>
        <h4>h4</h4>
        <h5>h5</h5>
        <h6>h6</h6>
        <p>P : 글자를 나타내는 태그</p>
        <footer>
            <h1>footer 입니다.</h1>
        </footer>
    </body>

</html>

Stereo Type Annotation

  • 스프링에서 기본적으로 제공
  • 특수한 기능을 가지고 있음
  • 자주 사용되는 대표적인 4종류
종류설명
@Controller요청과 응답을 처리하는 클래스에 사용
@Service비즈니스 로직을 구현한 클래스에 사용
@RepositoryPersistence 역할을 하는 클래스에 사용
@Component위 3가지 애노테이션의 상위(부모) 객체

Bean 생성

  • 1) @Configuraion 이용
  • 2) XML 설정 이용
  • 3) @ComponentScan 이용

DemoApplication.java

package com.example.demo;

import java.io.IOException;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

import com.example.demo.config.Bean3;
import com.example.demo.config.BeanConfig;
import com.example.demo.config.ImageUtil;

@SpringBootApplication
public class DemoApplication {

	public static void main(String[] args) throws IOException {
		ApplicationContext context = new AnnotationConfigApplicationContext(BeanConfig.class);
		String s = (String) context.getBean("bean1");
		System.out.println("bean 생성1 : "+s);
		((AnnotationConfigApplicationContext) context).close();

		ApplicationContext context2 = new ClassPathXmlApplicationContext("classpath:bean2.xml");
		int i = (int) context2.getBean("bean2");
		System.out.println("bean 생성2 : "+i);
		((ClassPathXmlApplicationContext) context2).close();

		ApplicationContext context3 = new AnnotationConfigApplicationContext(BeanConfig.class);
		Bean3 b = (Bean3) context3.getBean("bean3");
		System.out.println(b.run());
		((AnnotationConfigApplicationContext) context3).close();

        
        SpringApplication.run(DemoApplication.class, args);
	}

}

Beanconfig.java

package com.example.demo.config;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;

// @Configuration : 해당 클래스가 스프링 설정에 사용되는 클래스 라는것을 의미
// 클래스 이름은 자유롭게 지정 가능.
@Configuration

// @ComponentScan : Component를 스캔해준다.

// basePackages : 검색을 시작할 패키지를 정해준다.
// @ComponentScan(basePackages = "com.example.demo.config")

// basePackageClasses : 설정된 클래스의 패키지부터 모든 하위에 패키지에 대해 컴포넌트 스캔을  진행.
@ComponentScan(basePackageClasses = BeanConfig.class)
public class BeanConfig {
    //@Bean : 해당 메소드가 Bean을 등록하는 메소드 라는것을 의미
    // 메소드 명 : Bean의 이름으로 지정
    // 메소드의 파라미터는 Bean에 등록된 객체가 있다면 자동으로 전달된다.
    @Bean
    public String bean1(){
        return "첫번째 빈";
    }
}

Bean3

package com.example.demo.config;

import org.springframework.stereotype.Component;

@Component
public class Bean3 {
    public String run(){
        return "세번째 빈";
    }
}

ImageUtil

  • ImageUtil 클래스를 Bean으로 생성하고 save 메소드를 실행하여
    URL의 이미지를 다운로드하기

HomeController.java

package com.example.demo;

import java.io.IOException;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

import com.example.demo.config.Bean3;
import com.example.demo.config.BeanConfig;
import com.example.demo.config.ImageUtil;

@SpringBootApplication
public class DemoApplication {

	public static void main(String[] args) throws IOException {
		ApplicationContext context = new AnnotationConfigApplicationContext(BeanConfig.class);
		String s = (String) context.getBean("bean1");
		System.out.println("bean 생성1 : "+s);
		((AnnotationConfigApplicationContext) context).close();

		ApplicationContext context2 = new ClassPathXmlApplicationContext("classpath:bean2.xml");
		int i = (int) context2.getBean("bean2");
		System.out.println("bean 생성2 : "+i);
		((ClassPathXmlApplicationContext) context2).close();

		ApplicationContext context3 = new AnnotationConfigApplicationContext(BeanConfig.class);
		Bean3 b = (Bean3) context3.getBean("bean3");
		System.out.println(b.run());
		((AnnotationConfigApplicationContext) context3).close();

		//연습문제
		ApplicationContext context4 = new AnnotationConfigApplicationContext(BeanConfig.class);
		ImageUtil imageUtil = (ImageUtil) context4.getBean("imageUtil");
		imageUtil.save("http://ggoreb.com/images/luffy.jpg");
		((AnnotationConfigApplicationContext) context4).close();
        
        SpringApplication.run(DemoApplication.class, args);
	}

}

ImageUtil.java

package com.example.demo.config;
import java.net.URL;
import javax.imageio.ImageIO;

import org.springframework.stereotype.Component;

import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;

@Component
public class ImageUtil {
    public void save(String path) throws IOException {
        URL url = null;
        url = new URL(path);
        String fileName = path.substring(path.lastIndexOf("/") + 1);
        System.out.println("fileName : "+fileName); //luffy.jpg
        String fileExt = path.substring(path.lastIndexOf(".") + 1);
        System.out.println("fileExt : "+fileExt);
        BufferedImage img = ImageIO.read(url);
        ImageIO.write(img, fileExt, new File(fileName));
    }
}

profile
초보 개발자의 학습 저장용 블로그

0개의 댓글