**MyBatis가 필요 없어진다.

 

> 4가지 필요한 dependency 체크해서 spring starter project 를 생성해준다. 

 

> pom.xml에 서버돌릴 tomcatJSTL이 추가로 필요하니 MVN 가서 긁어다 붙여주도록 한다.

 

> DB에 접근하기 위한 application 속성을 작성해준다. resources 패키지에 가면 나뭇잎 모양이 있는데,

이전에  db.properties에 작성하던 것을 옮겨 적어주면 된다. + suffix/prefix/JPA 정보도 입력해준다.

(server port | MySQL | JPA | DDL | api | Database name | Database address 대충 이 정도 들어간다.)

 

> application을 구동시킬 main 매서드가 있는, JpaApplication에 스캔이 필요한 각 객체의 어노테이션을 달아준다.

(Bean이나 main Controller를 먼저 작성하고 나중에 추가해주는 것이 좋겠다. 필요없는 스캔이 생길수도 있으니)

 

> Controller 및 bean, service file 등 application에 필요한 각 파일을 생성해준다. 

 

 

 

 

JPA 사용법

1. Controller 생성한 후 RestController 어노테이션 붙여줌

2. BoardService 인터페이스 생성, 구현 체인 BoardServiceImpl.java도 생성

3. JPA를 상속하는 BoardDAO를 생성해주고, repository 어노테이션을 붙여 준다.

'Backend > Spring' 카테고리의 다른 글

사진 업로드 (SpringProject)  (0) 2022.06.28
Spring MVC @annotation 관련 정리.  (0) 2022.06.23
STS Error - Tomcat / Oracle  (0) 2022.06.23
Spring + myBatis 환경 설정  (0) 2022.06.21
Spring Basic Bean  (0) 2022.06.18

새로 알게 된 annotation들이 많다. 

 

그 중, Spring MVC 모델을 만드는데 사용하였던 annotation을 정리.

 

Structure :

Spring MVC 모델에서 어노테이션은 주로 Controller에 잡히게 된다. 프로그램이 실행되면 xml과 dispatcher 그리고 handler mapping을 거쳐 controller로 가게되는데, 어떠한 service를 제공할 것인지 Client Request를 구분하고 이를 제공하기 위해 실제 Service 파일과 DAO등에 접근 실행을 하는 곳이 바로 '컨트롤러'이다.

 

(정의가 틀렸다면 수정하겠습니다)

 

때문에 annotation 태그들은 대부분 컨트롤러에 모여있으며, dispatcher는 폴더를 뒤져 이를 읽어낸다. 

실제로 dispatcher.xml 에 작성된  코드이다.  @component 태그를 모두 스캔하여 해당 매서드를 활성화 하는 것인데, scanning 할 위치는 base-package 이하로 한다.  

	<context:component-scan base-package="user.bean" />
	<context:component-scan base-package="user.dao" />
	<context:component-scan base-package="user.service" />
	<context:component-scan base-package="spring.conf" />

 

아래는 controller에 작성된 @annotation이 적용된 코드이다.

	@PostMapping(value="write")
	@ResponseBody
	public void write(@ModelAttribute UserDTO userDTO) {
		userService.write(userDTO);
	}
	
	@PostMapping(value="checkId")
	@ResponseBody
	public String checkId(@RequestParam String id) {
		return userService.checkId(id);
	}
	
	@GetMapping(value="list")
	public String list() {
		return "/user/list";
	}

 

여기서 헷갈 릴 수 있는 것은, 우리가 XML을 통해서 IoC Container를 생성하지만 파일 상에 확인할 수 없듯이, dispatcher와 핸들러 또한 마찬가지라는 것이다. dispatcher와 mapper는 우리 눈에 보이지 않지만 Spring 내부에서 돌고 있다.

아래 이미지가 설명에 가장 적당할 것같다.

 

이미지 출처. https://yoonbing9.tistory.com/80

 

 

정리해보면,

 

(1) 우리가 생성한 dispatcher는 http//:~ /user/form(jsp) 라는 사용자의 https 요청을 받고 user 앞의 /를 통해 요청받은 파일의 위치를 인식한다.

(2) 가상에 생성된 handler는 어떠한 Controller 객체가 요청받은 내용을 수행 할 지 user 이하의 '/' 를 통해 정보를 받아오며 (아래 캡쳐의 user/upload, Mapping 작업을 수행한다.

(3) Controller 이하 작업 시작.

 

(4) (5) (6)의 내용은 추후에 다시 정리하고, 일단 controller에 도달하기까지의 내용이다.

 

직접 선언하는게 아니라 spring 내부적으로작동한다

/user/upload중에 upload는 mapper가 찾는것이 아니라 dispatcher가 찾는거고 HandlerMapping은 @어노테이션을 이하 value 값으로 찾는다. 

 

@PostMapping(value="upload")
	@ResponseBody
	public void upload(@RequestParam MultipartFile img) {
		//가상폴더
		String filePath = "D:\\Spring\\workspace\\chapter06_SpringWebMaven\\WebContent\\storage";
		String fileName = img.getOriginalFilename();
		
		File file = new File(filePath, fileName); //파일 생성

 


 

 @annotation

 

  • @Configuration: 빈 설정을 담당할 클래스를 설정한다. 이 클래스 안에서 @Bean 어노테이션이 동봉된 메소드를 선언하면, 그 메소드를 통해 스프링 빈을 정의하고 생명주기를 설정하게 된다. 자바 기반의 config가 싫다면 XML 쓰면 된다.
  • @Component: 빈을 선언하는 클래스를 작성하기 위해 넣는 어노테이션이며 @ComponentScan 의 주요 스캔 대상이다.
  • @Service:  @Component 어노테이션의 차이점을 알려면 캡슐화 개념에 대한 이해가 필요하다. 이 말은 즉슨, 보통 이 어노테이션을 달은 클래스에는 '비즈니스 레이어' 로직에 맞게 짜기 때문에 보통 별도의 데이터를 가지고 있지 않을 것이다. 이건 아주 올바른 사용 케이스이다. 이 어노테이션을 단 클래스는. 그저 업무 메소드만 정의하면 된다. 다른 빈에서 가져와 처리를 하고 결과를 제공하는 그저 비즈니스 로직만 정의하면 된다. 
  • @Autowired: 이 어노테이션은 필드, 메소드, 생성자에다가 넣을 수 있다. 아는 그대로다. 스프링 빈을 가져오는 가장 기본적인 방법이다. 해당 클래스에 맞는 빈을 가져오는데, 만약 하나만 있으면 이름을 아무렇게나 해도 가져오고, 만약 2개 이상이면 시그니처 명칭에 맞는 빈을 가져온다. 오류가 있을 시 NoUniqueBeanDefinitionException 예외가 발생한다.
  • @Bean: @Configuration 선언한 빈 설정 클래스에 빈 선언을 담당하는 어노테이션으로, 메소드에만 넣을 수 있다. 보통은 메소드 이름이 곧 빈 이름으로 탄생한다.
  • @Primary: @Configuration 선언한 빈 설정 클래스에 빈 선언을 담당하면서, 기본 빈 요소를 정의할 때 사용한다. 만약 같은 클래스로 여러 개의 빈을 설정했을 때, 이 어노테이션을 추가로 달면, @Autowired 어노테이션을 통해 빈을 주입 시 이 어노테이션을 가진 빈을 우선적으로 가져온다고 보면 된다. 
  • @Value: 생성자, setter 따위의 메소드, 필드 등에다가 스프링에서 설정한 값을 주입할 수 있다.

 

MVC annotation

  • @ResponseBody: 컨트롤러 메소드 리턴값에 이 어노테이션을 선언함으로써 스프링은 해당 응답 객체를 클라이언트가 요구하는 요청 내용 유형(Content-Type)에 따라 응답하도록 도와주는 어노테이션이다. 보통은 Jackson 모듈에 의해 json 유형으로 응답하며, 클라이언트가 xml 응답을 요청하면 xml 응답을 해주기도 한다.
  • @RestController: 이 어노테이션을 달면, 모든 컨트롤러 메소드는 @ResponseBody 어노테이션이 달린 반환 값을 달고 다니게 된다. 주로 REST API 설계 시 필수 어노테이션이라 보면 된다. 물론 ModelAndView 처럼 특수한 유형은 스프링이 평소 그대로 처리하여 응답해준다.
  • @RequestMapping(method = RequestMethod.GET, value = "/path"): 메소드에 달면, 해당 메소드는 이 어노테이션이 설정한 경로를 호출했을 때 메소드가 설정한 응답값을 받게 되며, 컨트롤러 클래스에 달면, 클래스에 설정한 경로를 기준삼아 각 메소드는 클래스 경로의 하위 경로로 추가되어 경로가 잡히게 된다. 또한 method 설정으로 GET만 받거나, POST로 받는 등 특정 HTTP 메소드에만 응답 가능하도록 설정할 수 있으며, GET 의 경우 @GetMapping 같이 메소드 별칭 어노테이션이 있으니 이걸 활용해도 된다. 거기에다가 consumes 속성으로 요청 값에 대한 유형을 한정지을 수 있으며, produces 속성을 통해 응답 유형을 강제할 수 있다. 이들 둘이 설정 시 지정 타입 안맞으면 400 Bad Request 응답을 뱉도록 스프링에서 설정되어 있다.
  • @RequestParam(value="name", defaultValue="World"): 컨트롤러 메소드 인자에서 요청값을 받을 때, 요청 주소(URL)에 ? 뒤로 시작하는 질의 문자열, POST 전송 시 요청받을 키/값, 등을 받을 수 있으며, required 속성으로 필수 여부를 지정할 수 있고, defaultValue 속성을 통해 요청이 없을 경우 대체 기본값을 설정할 수 있다. 만약 required = true 일 경우 해당 파라미터 없이 호출하면 400 Bad Request 응답을 반환하도록 설정되어 있다.  

 

annotation 파트 참고

https://dev.to/composite/-40c0

'Backend > Spring' 카테고리의 다른 글

STS4 SPRING BOOT - JPA  (0) 2022.07.14
사진 업로드 (SpringProject)  (0) 2022.06.28
STS Error - Tomcat / Oracle  (0) 2022.06.23
Spring + myBatis 환경 설정  (0) 2022.06.21
Spring Basic Bean  (0) 2022.06.18

JDBC ORACLE ERROR

 

1. 프로젝트 아이콘에 빨간 색 에러 표시 발생. (현재는 해결 상태)

 

Cannot load JDBC driver class 'oracle'

 

-> oracle을 찾지 못하고 있는 문제. 보통은 ojdbc.jar 파일을다 라이브러리에 추가해서 해결이 가능하지만, 이번에는 해결이 안된다. pom.xml에 DI 주입이 안되어있나 확인해보았는데 역시 문제 없다.

 

(1) 일단 Project clean 해보기.

 

project clean 해보기

 

(2) pom.xml에 입력완료 된 jar file이 bin안에 들어있는지 확인하기.

중복으로 들어있으면 충돌날 수 있을 것 같아서, bin안에 있는 것을 지워봤다. -> 오류 해결됨.

 

아이콘에 에러 발생

 

문제는 STS 상에서 lib안에 있는 jar file을 삭제할 경우, 이미 system에서 사용하고 있는 파일이라 삭제가 불가능하다는 메세지가 뜬다는 것이다. DI 빠진 부분이 없는지 pom.xml 다시 한 번 확인해 본 후, 프로젝트가 들어있는 로컬 폴더에 들어가 수동으로 삭제를 진행해주었다.

 

-> Project Refresh후에 에러 표시 사라짐.


Tomcat Error

 

Oracle 에러 해결 후, 서버 문제가 떴다. tomcat 설정에 문제가 있는 듯 하여 확인해보았다.

 

(1) Project -> properties -> Project Facets -> runtimes -> tomcat 체크되어있나 확인.

체크가 해제되어있다. 분명 서버 설정을 해두었는데, tomcat이 빠진 이유가 뭔지 찾기 시작 

 

(2) 원인 : Maven -> Update Project 를 눌러 refresh를 해주었었는데, 해당 기능과 내가 설치한 Zulu JDK에 호환이 안되고 있는 것 같았다. 설정을 하고 apply를 마친후에도 update Project를 누를 시, tomcat이 계속해서 빠지는 것을 확인했다. 

 

 

 

 

 

'Backend > Spring' 카테고리의 다른 글

사진 업로드 (SpringProject)  (0) 2022.06.28
Spring MVC @annotation 관련 정리.  (0) 2022.06.23
Spring + myBatis 환경 설정  (0) 2022.06.21
Spring Basic Bean  (0) 2022.06.18
Spring XML  (0) 2022.06.15

SQL mapping framework MyBatis.

JDBC 작업을 단축시키고, sql 문을 java 문과 섞지 않아도 되는 편리함을 제공한다.. 

 

Spring 연동 순서.

 

1. pom.xml -> mybatis 라이브러리 추가.

(https://mvnrepository.com/) 가서 검색하면 대부분의 프레임워크가 나온다. 

그냥 최신버전을 다운 받는 것 보다 내가 사용하고 있는 util의 버전을 체크해서 맞는 제품을 추가하는 것이 좋다. 

 

(1) mybatis : 

 

	<!-- MyBatis -->
	
	<dependency>
	    <groupId>org.mybatis</groupId>
	    <artifactId>mybatis-spring</artifactId>
	    <version>2.0.6</version>
	</dependency>
	
	<dependency>
	    <groupId>org.mybatis</groupId>
	    <artifactId>mybatis</artifactId>
	    <version>3.5.7</version>
	</dependency>
	
	
	<dependency>
	    <groupId>org.apache.commons</groupId>
	    <artifactId>commons-dbcp2</artifactId>
	    <version>2.9.0</version>
	</dependency>

 

++++

JDBC dependency code도 기본으로 필요.

 

	<!-- SPRING JDBC -->
	<dependency>
	    <groupId>org.springframework</groupId>
	    <artifactId>spring-jdbc</artifactId>
	    <version>5.3.15</version>
	</dependency>

 

 

 

추가 된 jar file 들...

 

 

2.SQLSessionFactory

 

MyBatis에서 가장 핵심적인 객체는 SQLSession이라는 녀석과 SQLSessionFactory 인터페이스 이다.

SQLSessionFactory는 이름만 보아도 SQLSession을 만들어 내는 공장이라는 것을 알 수 있다.

SQLSession은 개발자가 이를 통해 Connection을 생성하거나 원하는 SQL을 전달하고, 결과를 리턴 받는 구조로 작성하게 된다.

root-context.xml에 다음을 추가한다.

 

 

3. lifecycle.

 

mybatis + Spring 의 lifeCycle. 모호 할 때마다 틈틈이 보자.

 

사진 출처 https://codevang.tistory.com/249

 

 

 

Maven 으로 바꾸기

 

 

applicationContext -

 


<context:property-placeholder location="classpath:spring/db.properties" />   
<tx:annotation-driven transaction-manager="transactionManager" />

--->>>>

 

Spring config 

 

@Configuration
@EnableTransactionManagement 
@PropertySource("classpath:spring/db.properties")

 

 

 

 

 

 

 

<context:component-scan base-package="spring.conf"/> xml에 마지막 추가.

 

각 service 및 main, DTO package 들에 있는 java 파일

setter 어노테이션을 날려주고 Autowired 로 변경해준다. 

 

class 명 위에 @Component로 어노테이션 달아준다. context Scan이 component 잡아줄 수 있게. 이때 service 파일은 @ Service 어노테이션 붙여줘도 된다. & DAO 파일은 @Repository로 어노테이션 달아주면 된다. (전부 @Componen)로 달아줘도 상관없음.

 

 

'Backend > Spring' 카테고리의 다른 글

Spring MVC @annotation 관련 정리.  (0) 2022.06.23
STS Error - Tomcat / Oracle  (0) 2022.06.23
Spring Basic Bean  (0) 2022.06.18
Spring XML  (0) 2022.06.15
Spring STS 설치  (0) 2022.06.14

spring은 xml을 통해 bean을 형성해주는데, 

 

main함수가 들어있는 java 파일에서는 xml에서 생성한 bean에서 id 값을 통해 데이터를 받아와 출력을 진행한다.

class는 bean에 넣을 값을 받아 올 위치를 말한다.

 

예를 들어,

<bean id="messageBean" class="practice3.MessageBeanEn" scope=""/>

(Application.xml)

 

라는 xml 코드가 작성되었고,

 

	ApplicationContext context = new ClassPathXmlApplicationContext("Application.xml");
		
		MessageBean messageBean = (MessageBean)context.getBean("messageBean");
		messageBean.sayHello("Spring");
		System.out.println("-----------------");
		
		MessageBean messageBean2 = (MessageBean)context.getBean("messageBean");
		messageBean2.sayHello("Spring");
		System.out.println("-----------------");
	
		MessageBean messageBean3 = (MessageBean)context.getBean("messageBean");
		messageBean3.sayHello("Spring");
		System.out.println("-----------------");

(main.java)

 

main 자바 파일에서 해당 코드를 작성하였다면, ClassPathXmlApp("application.xml")의 인스턴스는 "messageBean" 이라는 id값을 통해 data를 받아오고 있는 것이다.

 

여기서 "messageBean"은 위에서 xml설정된 파일의 Id값이다.

 

아직 DTO에 데이터 입력값이 없기 때문에 예제에서 실제로 Bean이 생성되었고 데이터가 실제로 저장되었음을 보여줄 내용이 없다. 하지만 아래 sungjuk project에서는 확인이 가능하다.

 

** 중요한 것 

기본적으로 spring xml에서 bean을 생성하였을 시, 디폴트로 객체 한개 당 한개의 bean을 생성하는 Singleton 개념을 갖는다. 이 싱글톤을 해제하고 싶으면 아래와 같이 scope에 "prototype" 값을 넣어주면 된다.

 

<bean id="messageBean" class="practice3.MessageBeanEn" scope="prototype"/>

 

아래 코드는, 생성자를 통해 직접 DTO에 값을 넣어주는 xml 코드이다. 

<bean id="sungJukDTO" class="practice5.SungJukDTO">
			<property name="name" value="홍길동"/> 
			<property name="math" value="95"/>
			<property name="kor" value="97"/>
			<property name="eng" value="100"/>
			<property name="tot" value="292"/>
			<property name="avg" value="97"/>
		</bean>
		
		<bean id="sungJukImpl" class="practice5.SungJukImpl">
			<constructor-arg ref="sungJukDTO"></constructor-arg>
		</bean>

(1) sungJukDTO 라는 ID값을 갖는 bean에 property name 별 각각의 value를 넣어주었다.

(2) sungJukImpl 라는 ID값을 갖는 bean에는 생성자를 통하여 (1)번의 value를 넣어주었다. 

 

이렇게 되면, 

 

다음 코드의 DTO 초기값은 (1) 이 된다.

--> xml 사용하지 않았다면 아래 코드에 직접 변수 초기값을 설정하였을 것이다.

 

그 초기값을 xml로 지정해준 후, modify method를 이용하여 DTO에 들어갈 각 value를 수정해주는 것이다. 

public class SungJukImpl implements SungJuk{
	private SungJukDTO sungJukDTO;
	
	public SungJukImpl(SungJukDTO sungJukDTO) {
		this.sungJukDTO = sungJukDTO;
	}
	
	@Override
	public void calcTot() {
		sungJukDTO.setTot(sungJukDTO.getKor() + sungJukDTO.getMath() + sungJukDTO.getEng());
	}
	@Override
	public void calcAvg() {
		sungJukDTO.setAvg(sungJukDTO.getTot()/0.3);
	}
	
	@Override
	public void modify() {
		Scanner scn = new Scanner(System.in);
		
		System.out.println("이름을 입력하세요: ");
		sungJukDTO.setName(scn.next());
		
		System.out.println("국어 점수를 입력하세요: ");
		sungJukDTO.setKor(scn.nextInt());
		
		System.out.println("영어 점수를 입력하세요: ");
		sungJukDTO.setEng(scn.nextInt());
		
		System.out.println("수학 점수를 입력하세요: ");
		sungJukDTO.setMath(scn.nextInt());
	}	
		
	@Override
	public void display() {
		System.out.println("이름\t국어\t영어\t수학\t총점\t평균");
		System.out.println(sungJukDTO);
	}
}

 

 

'Backend > Spring' 카테고리의 다른 글

Spring MVC @annotation 관련 정리.  (0) 2022.06.23
STS Error - Tomcat / Oracle  (0) 2022.06.23
Spring + myBatis 환경 설정  (0) 2022.06.21
Spring XML  (0) 2022.06.15
Spring STS 설치  (0) 2022.06.14

1. 복습

 

ApplicationContext? 

BeanFactory 인터페이스를 상속받은 하위 인터페이스이다. BeanFactory가 제공하는 기능 외에도, 추가적으로 자원처리 추상화 등의 기능을 제공하고 있어 BeanFactory보다 자주 사용한다. 

 

선언시에는 다음을 사용하며 (내가 배운 위주 ) xml 위치를 어떻게 넘겨주느냐에 따라  몇 가지 다른 클래스를 사용하기도 한다.

ApplicationContext context = new ClassPathXmlApplicationContext(xml파일명);

 

 

 

 

2. Bean 설정.

<bean> 태그를 이용해 빈을 정의한다.

id는 빈의 id를 통해 참조할 경우가 있는 경우에만 설정하면 된다. id 값은 개발자가 임의로 설정해주면 된다. 

 

xml에서 설정된 id를 getBean 메서드를 통해 끌어오고 있다
xml에 bean id 설정.

id, class외에 속성은 나중에 더 배우며 추가하는 것으로.

'Backend > Spring' 카테고리의 다른 글

Spring MVC @annotation 관련 정리.  (0) 2022.06.23
STS Error - Tomcat / Oracle  (0) 2022.06.23
Spring + myBatis 환경 설정  (0) 2022.06.21
Spring Basic Bean  (0) 2022.06.18
Spring STS 설치  (0) 2022.06.14

D: 드라이브 내에 Spring 폴더 생성

repository 설치하기 repository 위치 &ndash; C:\Users\***my account****\.m2\repository\org\springframework\spring-context

 

 

-> lib, workspace 폴더 생성

-> https://repo.spring.io/ui/native/release/org/springframework/spring/

-> 버전 선택 ( 나는 5.3.15 으로 설치했음.)

-> dist.zip 파일 다운

-> http://dist.springsource.com/release/STS/index.html (spring tool suite : STS 다운받기)

-> 가장 최신파일 다운로드 (spring-tool-suite-3.9.12.RELEASE-e4.15.0-win32-x86_64.zip)

-> spring 폴더에 dist.zip 압축 해제하기 -> spring 설치완료 ( 압축해제만 하면된다. 따로 exe 설치할 필요 없음.)

 

lombok 설치 과정
맨 마지막줄에 lombok.jar 구문이 들어가있으면 설치가 완료된 것이다.

 

 

- 롬복 설치되어 있는지 확인 -> (sts.bundle-> sts-RELEASE folder -> sts 파일폴더 notepad로 open)

- Spring legacy project는 생성할때 spring MVC로 웹과 연결 한다.

 

아래는 Jar 파일 넣고 build path 클릭하는 과정.

 

 

lib에 6가지 jar file 넣어준 후, 드래그 하여 마우스 우클릭, build path 선택해주면 refer library가 위와 같이 생성된다.

 

 

'Backend > Spring' 카테고리의 다른 글

Spring MVC @annotation 관련 정리.  (0) 2022.06.23
STS Error - Tomcat / Oracle  (0) 2022.06.23
Spring + myBatis 환경 설정  (0) 2022.06.21
Spring Basic Bean  (0) 2022.06.18
Spring XML  (0) 2022.06.15

+ Recent posts