프로젝트에서 패키지명을 대문자로 작성하면 안됨. 그 이유로는
- 자바의 공식 네이밍 규약
자바의 패키지명은 반드시 소문자로 작성해야함 - 운영 체제에서의 문제
일부 운영 체제에서는 파일 시스템이 대소문자를 구분(리눅스나 맥OS는 대소문자를 구분하지만, 윈도우는 대소문자를 구분하지 않음)
패키지명을 대문자로 시작하면 프로젝트가 다양한 운영 체제에서 실행될 때 호환성 문제가 발생할 수 있음. 이로 인해 애플리케이션의 배포 및 실행에 문제가 발생할 가능성이 커짐 - URL 경로에서 대소문자 구분 문제
- 자바 클래스명과 패키지명 구분
- 호환성 및 표준화
lombok
프로젝트를 실행하면 home.jsp가 켜지면서 Console에는 다양한 로그 정보가 찍힘.
여기서 HomeController에 현재 객체를 참조하는 키워드인 this를 찍어내면?
this.toString()을 호출. 오버라이드 하지 않았다면 Object.toString()의 기본 구현인 객체의 클래스명과 해시코드를 포함하는 문자열을 반환할 것이다.
package org.zerock.controller;
import java.text.DateFormat;
import java.util.Date;
import java.util.Locale;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
/**
* Handles requests for the application home page.
*/
@Controller
public class HomeController {
private static final Logger logger = LoggerFactory.getLogger(HomeController.class);
/**
* Simply selects the home view to render by returning its name.
*/
@RequestMapping(value = "/", method = RequestMethod.GET)
public String home(Locale locale, Model model) {
logger.info("Welcome home! The client locale is {}.", locale);
Date date = new Date();
DateFormat dateFormat = DateFormat.getDateTimeInstance(DateFormat.LONG, DateFormat.LONG, locale);
String formattedDate = dateFormat.format(date);
model.addAttribute("serverTime", formattedDate );
System.out.println(this);
return "home";
}
}
이를 lombok을 이용해서 getter/setter, toString(), 생성자 등을 자동으로 생성해주게 끔 설치 및 설정
https://projectlombok.org/download 롬복 다운로드
이 파일을 열면
이렇게 뜰 경우에는 cmd창에서 설치
다운받은 디렉토리로 이동 후 명령어 작성
기다리면
자동으로 찾아주면 Install/Update -> Quit Installer
잘 설치되었는지 확인하려면, STS에 lombok.jar 파일이 생기고, STS.ini를 열어보면
가장 마지막 줄에 이렇게 추가됨
지금까지는 개발도구에 세팅을 했고, 프로젝트에서는 사용할 수없음. 사용하려면 pom.xml에 lombok 추가
https://mvnrepository.com/artifact/org.projectlombok/lombok 아까 다운 받은 버전과 같은 것을 복사한 후 pom.xml에 추
확인
HomeController에 @Controller 어노테이션 및에 @ToString 어노테이션을 추가하고 import하면 아래와 같이 됨
이후 프로젝트를 실행하면
의존성 주입 : 스프링을 이용하는 환경에서 각각의 객체를 생성하고 이를 스프링의 설정을 통해서 연결
스프링에서 객체를 만들면 이를 사용하기 위해서 bean을 추가해줘야한다.
근데 어떤 것을 bean으로 추가해주고, 어떤 것을 bean으로 추가할 필요가 없다.
그 기준은 무엇일까? 바로 오래 살아남아야하고 오래 일을 해야하는 것을 bean으로 추가해준다
bean으로 등록하는 방법은? XML 또는 어노테이션을 이용하는 방법이 있다.
어노테이션을 이용하는 방법은
1. @Component 어노테이션 추가
package org.zerock.sample;
import org.springframework.stereotype.Component;
@Component
public class Chef {
}
2. root-context.xml에서 Namespaces context 추가
3. Source에서 context:component-scan 태그 추가
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans https://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.3.xsd">
<!-- Root Context: defines shared resources visible to all other web components -->
<context:component-scan base-package="org.zerock.sample"></context:component-scan>
</beans>
lombok 이용하기 위해 Chef 클래스에 @Data 어노테이션 추가. 추가하면 자동으로 equals(), hashCode(), toString()이 상속됨
※ Chef.java 파일의 아이콘을 보면 S가 붙어 있는데 이는 '스프링이 빈으로 관리한다'라고 생각하면 됨
Restaurant(Chef 클래스를 이용하는 클래스)
package org.zerock.sample;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import lombok.ToString;
@Component
@ToString
public class Restaurant {
@Autowired
private Chef chef;
}
이렇게하면 주입이 끝난 상태
테스트를 위한 설정
pom.xml에서
<exclusions>
<exclusion>
<groupId>javax.mail</groupId>
<artifactId>mail</artifactId>
</exclusion>
<exclusion>
<groupId>javax.jms</groupId>
<artifactId>jms</artifactId>
</exclusion>
<exclusion>
<groupId>com.sun.jdmk</groupId>
<artifactId>jmxtools</artifactId>
</exclusion>
<exclusion>
<groupId>com.sun.jmx</groupId>
<artifactId>jmxri</artifactId>
</exclusion>
</exclusions>
<scope>runtime</scope>
위의 코드를 삭제
+ log4j 버전 1.2.17로 변경
+테스트 라이브러리 추가
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/maven-v4_0_0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>org.zerock</groupId>
<artifactId>controller</artifactId>
<name>ex00</name>
<packaging>war</packaging>
<version>1.0.0-BUILD-SNAPSHOT</version>
<properties>
<java-version>1.6</java-version>
<org.springframework-version>5.2.7.RELEASE</org.springframework-version>
<org.aspectj-version>1.6.10</org.aspectj-version>
<org.slf4j-version>1.6.6</org.slf4j-version>
</properties>
<dependencies>
<!-- Spring -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>${org.springframework-version}</version>
<exclusions>
<!-- Exclude Commons Logging in favor of SLF4j -->
<exclusion>
<groupId>commons-logging</groupId>
<artifactId>commons-logging</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>${org.springframework-version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-test</artifactId>
<version>${org.springframework-version}</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.projectlombok/lombok -->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.36</version>
<scope>provided</scope>
</dependency>
<!-- AspectJ -->
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjrt</artifactId>
<version>${org.aspectj-version}</version>
</dependency>
<!-- Logging -->
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>${org.slf4j-version}</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>jcl-over-slf4j</artifactId>
<version>${org.slf4j-version}</version>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
<version>${org.slf4j-version}</version>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.17</version>
</dependency>
<!-- @Inject -->
<dependency>
<groupId>javax.inject</groupId>
<artifactId>javax.inject</artifactId>
<version>1</version>
</dependency>
<!-- Servlet -->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>servlet-api</artifactId>
<version>2.5</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>javax.servlet.jsp</groupId>
<artifactId>jsp-api</artifactId>
<version>2.1</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>jstl</artifactId>
<version>1.2</version>
</dependency>
<!-- Test -->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.7</version>
<scope>test</scope>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<artifactId>maven-eclipse-plugin</artifactId>
<version>2.9</version>
<configuration>
<additionalProjectnatures>
<projectnature>org.springframework.ide.eclipse.core.springnature</projectnature>
</additionalProjectnatures>
<additionalBuildcommands>
<buildcommand>org.springframework.ide.eclipse.core.springbuilder</buildcommand>
</additionalBuildcommands>
<downloadSources>true</downloadSources>
<downloadJavadocs>true</downloadJavadocs>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>2.5.1</version>
<configuration>
<source>1.8</source>
<target>1.8</target>
<compilerArgument>-Xlint:all</compilerArgument>
<showWarnings>true</showWarnings>
<showDeprecation>true</showDeprecation>
</configuration>
</plugin>
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>exec-maven-plugin</artifactId>
<version>1.2.1</version>
<configuration>
<mainClass>org.test.int1.Main</mainClass>
</configuration>
</plugin>
</plugins>
</build>
</project>
테스트 코드 만들기 → 경로는 src/test/java안에 패키지 만들기
package org.zerock.sample;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import lombok.extern.log4j.Log4j;
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration("file:src/main/webapp/WEB-INF/spring/root-context.xml") // 오타 나기 쉬움
@Log4j
public class SampleTests {
@Test
public void test1() {
System.out.println("test1()");
log.info("test1()");
}
}
해결방법은 https://developer-syubrofo.tistory.com/41
세팅 확인
레스토랑 들고오기
package org.zerock.sample;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import lombok.extern.log4j.Log4j;
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration("file:src/main/webapp/WEB-INF/spring/root-context.xml") // 오타 나기 쉬움
@Log4j
public class SampleTests {
@Autowired
private Restaurant restaurant; // 주입을 받아야함
@Test
public void test1() {
System.out.println("SampleTests test1()");
log.info("Log.info test1()");
log.info(restaurant);
}
}
package org.zerock.sample;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import lombok.ToString;
@Component
@ToString
public class Restaurant {
@Autowired
private Chef chef;
}
Restaurant은 만든 것이 없음.
즉 스프링 프레임워크 : 필요한 것 -> 선언 -> 어노테이션, 설정 -> 자동으로 필요한 객체를 만들어 줌
객체 주입 방법
1. 필드 주입
package org.zerock.sample;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import lombok.ToString;
@Component
@ToString
public class Restaurant {
@Autowired
private Chef chef;
}
2. Setter 주입
package org.zerock.sample;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import lombok.Setter;
import lombok.ToString;
@Component
@ToString
public class Restaurant {
@Setter(onMethod_ = {@Autowired})
private Chef chef;
}
3. 생성자 주입
package org.zerock.sample;
import org.springframework.stereotype.Component;
import lombok.AllArgsConstructor;
import lombok.ToString;
@Component
@ToString
@AllArgsConstructor
public class Restaurant {
private Chef chef;
}
4. 최근 가장 권장하는 방법(5. 이상 버전부터 가능)
package org.zerock.sample;
import org.springframework.stereotype.Component;
import lombok.RequiredArgsConstructor;
import lombok.ToString;
@Component
@ToString
@RequiredArgsConstructor
public class Restaurant {
private final Chef chef;
}
final로 된 객체를 찾아서 주입이 됨
스프링 설정 파일 root-context.xml(객체), servlet-context.xml(웹) 두 개가 존재
둘로 나눈 이유는? 스프링 프레임워크는 객체 프레임워크 → 외부 확장 → 외부에 대한 설정을 가져가는 것을 분리
에러가 나면 가장 먼저 확인해야할 것은 무엇일까?
component-scan이 제대로 되는지 확인해야함
package org.zerock.sample;
public class SampleHotel {
}
SampleHotel의 경우 생성만 했고 아무런 어노테이션이 존재하지 않음.
하지만 package org.zerock.sample는 component-scan 대상임 -> 어노테이션을 추가하면 스프링에서 관리를 시작함
어노테이션을 추가하면
package org.zerock.sample;
import org.springframework.stereotype.Component;
import lombok.ToString;
@Component
@ToString
public class SampleHotel {
private Chef chef;
public SampleHotel(Chef chef) {
super();
this.chef = chef;
}
}
※최근 들어서 추세는 new 예약어로 객체를 만들지 않음. 이유는 new 예약어로 객체를 생성하면 클래스에 종속적이게 되므로 다른 방법으로 객체를 만드는 방법을 선택한다고 함.
'organize > 스프링' 카테고리의 다른 글
스프링 웹 프로젝트 3 (0) | 2024.12.29 |
---|---|
스프링 웹 프로젝트 2 (0) | 2024.12.28 |
웹 시큐리티 (0) | 2024.10.05 |
프레임워크, Spring과 Spring Boot (1) | 2024.10.04 |
redirect, redirect와 RequestDispatcher (0) | 2024.10.03 |