● Spring Framework
● Spring의 특징
* shift + ctrl + P
: VSC에서 (View ➡ Comment Palette) 명령 팔레트 실행.
명령 팔레트에서 추가할 팔레트들을 선택한다.
alt + shift + f
: 들여쓰기 자동 조정. 소스코드 정리
127.0.0.1
: 내 자신, 로컬 호스트
ctrl+ /
: html 해당 줄 주석 처리
ctrl + / : <!-- 주석내용 -->
: 소스코드 뒤에 주석 적기
ctrl + shift + k
: 한줄 삭제
alt + shift + 방향키 위아래
: 한줄 복사
alt + 방향키 위아래
: 한줄씩 라인 이동
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";
}
}
<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>
종류 | 설명 |
---|---|
@Controller | 요청과 응답을 처리하는 클래스에 사용 |
@Service | 비즈니스 로직을 구현한 클래스에 사용 |
@Repository | Persistence 역할을 하는 클래스에 사용 |
@Component | 위 3가지 애노테이션의 상위(부모) 객체 |
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);
}
}
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 "첫번째 빈";
}
}
package com.example.demo.config;
import org.springframework.stereotype.Component;
@Component
public class Bean3 {
public String run(){
return "세번째 빈";
}
}
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);
}
}
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));
}
}