에러 :  'The import javax.annotation.Resource cannot be resolved'

 

원인 :  javax.annotation.Resource가 import 되지 않아서 발생한 에러
해결

pom.xml 파일에 추가 설정

		<!-- javax.annotation -->
		<dependency>
			<groupId>javax.annotation</groupId>
			<artifactId>javax.annotation-api</artifactId>
			<version>1.3.1</version>
		</dependency>

MessageConverter 정의 및 종류


 

정의

Spring framework에서 HTTP 요청 본문과 응답 본문을 java 객체로 변환하고 역으로 변환하는 역할을 담당하는 컴포넌트이다.

 

Spring MVC에서는 HTTP 요청이나 응답의 본문을 객체로 변환하거나, 객체를 HTTP 메시지로 변환하는데 사용된다.

주로 RESTful 웹 서비스에서 JSON이나 XML과 같은 형식의 데이터를 주고받을 때 사용한다.

 

@ResponseBody //응답
@RequestMapping(value="/hello", method=RequestMethod.POST)
public String hello(@RequestBody String param){ //요청
	return "result";
 }

 

위와 같이 어노테이션을 하게 되면 스프링은 messageConverter를 사용해 HTTP 요청이나 응답을 메세지로 변환하게 된다. 즉, 위처럼 파라미터 부분에 @RequestBody를 입력할 경우 파라미터 타입에 맞는(String) 메세지 컨버터를 선택한 뒤 HTTP 요청 본문을 통째로 메세지로 변환하여 파라미터에 바인딩하는 것이다.

 

*바인딩이란?

사용자가 웹 페이지의 폼에 입력한 데이터를 서버로 보낼 때, Spring MVC는 이 데이터를 컨트롤러의 메서드에 매개변수로 바인딩하여 처리한다. 이렇게 폼에서 입력한 데이터를 컨트롤러의 메서드에 매개변수로 바인딩하는 과정을 데이터 바인딩이라고 한다. 이 과정을 통해 사용자가 입력한 데이터를 컨트롤러에서 쉽게 사용할 수 있게 된다.

 

GET, POST 요청의 경우

  • GET : GET 방식의 요청에는 사용되지 않는다. 메시지 컨버터는 HTTP 요청의 본문(body)에 포함된 데이터를 처리하는 데 사용되는데, GET요청의 경우 본문이 없기 때문에 메시지 컨버터를 사용할 필요가 없다.
  • POST : POST 요청의 경우 요청 본문에 데이터를 담아 전송하기 때문에 이러한 데이터를 객체로 변환하기 위해 메시지 컨버터가 사용된다.

 

유용한 메시지 컨버터의 종류

 

  • Jaxb2RootElementHttpMessageConverter :

- Spring에서 XML 형식의 데이터를 처리하는 메시지 컨버터 중 하나이다.

- 이 메시지 컨버터는 java 객체를 XML로 변환하거나, XML을 java 객체로 변환하는 데 사용된다.

- @XmlRootElement와 @XmlType이 붙은 클래스를 이용한다.

- 지원하는 미디어 타입은 application/xml, application/*+cml, text/xml이다.

 

  • MashallingHttpMessageConverter

 

- 이 컨버터를 등록할 때는 maechaller와 unmarshaller를 설정파일에 등해줘야 한다.

- 지원하는 미디어 타입은 위와 동일.

- 주어진 XML 바인딩 프레임워크를 사용하여 java 객체와 XML 문서 간의 매핑을 수행한다. 

 

  • MappingJacksonHttpMessageConverter

- Jackson 라이브러리를 기반으로 작성되었으며 JSON 데이터와 Java 객체 간의 매핑을 수행한다.
- 지원하는 미디어 타입은 application/json이다.

- 변환하는 오브젝트 타입의 제한은 없지만 프로퍼티를 가진 자바빈 스타일이나 HashMap을 이용해야 정확한 변환 결과를 얻을 수 있다.

 

*설정 파일 등록

import org.springframework.context.annotation.Configuration;
import org.springframework.http.converter.HttpMessageConverter;
import org.springframework.http.converter.json.MappingJackson2HttpMessageConverter;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;

import java.util.List;

@Configuration
public class WebMvcConfig implements WebMvcConfigurer {

    @Override
    public void configureMessageConverters(List<HttpMessageConverter<?>> converters) {
        // 기본 메시지 컨버터 목록을 가져옴
        converters.add(new MappingJackson2HttpMessageConverter());
        // 다른 컨버터 등록하거나 기본 컨버터 삭제할 수도 있음
    }
}

 

 

 

참고 사이트/자세한 설명있음

https://joont92.github.io/spring/MessageConverter/

 

[spring] MessageConverter

앞서 우리가 HTTP 요청을 모델에 바인딩하고 클라이언트에 보낼 HTTP 응답을 만들기 위해 뷰를 사용했던 방식과는 달리, HTTP 요청 본문과 HTTP 응답 본문을 통째로 메세지로 다루는 방식이다. 주로 X

joont92.github.io

 

 

Parameter와 Argument 


 

Parameter

  • 매개변수
  • 함수를 정의할 때 사용되는 변수를 의미한다. f(x, y)에서 x와 y에 해당한다.

Argument

  • 인수
  • 함수를 호출할 때 사용하게 되는 변수값을 의미한다. f(3, 4)에서 3과 4에 해당한다.
  • 함수에 전달되는 실제값이다. 

 

< 예시 >

function plus (num1, num2){
	return num1 + num2;
    }
  
//여기서 num1과 num2는 parameter 이다.

plus(1, 2);
//1과 1는 argument 이다.

MyBatis ?


 

백엔드에서 데이터를 저장하고 조회하려면 데이터베이스를 활용해야 한다. 

 

Java 기반의 Spring 또는 Springboot에서 데이터 베이스 접속을 편하게 사용하기 위해서는 MyBatisSQL Mapper 기술 또는 ORM 기술이 필요하다. 둘 다 DB와의 연동, 저장을 위한 기술이며 SQL Mapper는 '개발자가 작성한 SQL 실행 결과를 객체에 매핑' 시켜주는 프레임워크이며, ORM은 객체와 DB의 데이터를 '자동으로 매핑'시켜주는 프레임워크를 말한다. 

 

SQL Mapper 기술을 제공하는 것이 'MyBatis'이며, ORM 기술을 제공하는 것이 'JPA(Java Persistence Api)'이다. 두 가지 기술은 모두 데이터를 관계형 데이터베이스에 저장, 즉 영속화(Persistence) 시킨다는 측면에서는 동일하지만, 서로 다른 접근 방식을 채택하고 있다.

 

장점

  • Java 코드와 SQL 매핑

MyBatis를 사용할 경우 SQL문을 XML 파일에 별도로 저장하기 때문에 코드를 보기에도 편하고 수정도 용이하다. 

XML 파일에 SQL문을 작성하면 MyBatis가 Java 메소드와 SQL문을 매핑시켜 자동으로 연결해준다.

 

  • 동적 SQL 생성 기능

MyBatis는 동적인 SQL문 생성 기능을 제공하여 프로그램 실행 중 입력되는 파라미터에 따라 서로 다른 SQL문을 동적으로 생성해내는 기능을 제공한다. 이는 MyBatis 내에 <if> <choose> <otherwise> <foreach> 등의 문법을 지원하기 때문에 가능한 것이다. 

 

단점

  • CRUD 단순 작업에 반복 수작업 필요

SQL을 직접 만들어야 하므로 CRUD같은 기본 코드에 대해서 단순 코드를 반복작업 해야한다. 그렇게 되면 개발 생산성이 떨어지고 코드에 대한 유지보수도 힘들다.

 

  • 데이터 베이스에 종속적

특정 DB를 기준으로 SQL문이 작성되어 있어 DB를 변경하게 된다면 SQL문을 전부 확인하며 수정해야 한다.

 

 

참고 페이지. 더 자세한 설명. JPA와 장단점 비교

https://www.elancer.co.kr/blog/view?seq=231

 

JPA vs Mybatis, 현직 개발자는 이럴 때 사용합니다. I 이랜서 블로그

서버에서 데이터 베이스를 효율적으로 사용하기 위해 사용하는 JPA와 Mybatis를 실무에서는 언제 어떻게 사용할까요? 이랜서에서 알려드립니다. I 소트프웨어, 소프트웨어 개발자, 네이버 소프트

www.elancer.co.kr

 

 

 

콘솔창에서 이런 문구를 만날 수 있는데 8.0 이상 버전의 MySQL 사용시 기존 클래스가 변경되었기 때문에 수정하라는 내용이다. 

 

Loading class `com.mysql.jdbc.Driver'. 
This is deprecated. The new driver class is `com.mysql.cj.jdbc.Driver'. 
The driver is automatically registered via the SPI and manual loading of the driver class 
is generally unnecessary.

 

 

해결 : root-context.xml 파일에서 'com.mysql.cj.jdbc.Driver'로 수정해주면 된다.

 

* 당연하지만 여기서 user name과 user password에는 본인이 초기설정한 값을 넣어줘야 한다.

 

 

에러 : The prefix "mvc" for element "mvc:interceptors" is not bound.
원인 : 네임스페이스 참조가 누락되어 발생
해결 : servlet-context.xml 파일의 상단 Bean에 아래 구성을 추가한다.
xmlns:mvc="http://www.springframework.org/schema/mvc"

 

 

 

JUnit 단위 테스트


 

Calculator.java 파일 생성

 

public class Calculator {
	
	public int add(int num1, int num2) {
		return num1 + num2;
	}

}

 

 

CalculatorTest.java  파일 생성

New > JUnit Test Case

 

import static org.junit.Assert.*;

import org.junit.Test;

public class CalculatorTest{
@Test
public void test() {
	Calculator calculator = new Calculator();
	
	int resultAdd = calculator.add(5, 5);
	
	System.out.println("resultAdd : " + resultAdd);
	}
}

 

 

JUnit Test 진행

CalculatorTest.java 우클릭 > Run As > JUnit Test 

 

 

결과값 확인

Console 창에서 값 확인

 

@RequestMapping ?


 

Spring 개발 시 특정 URL로 요청(Requst)을 보내면 Controller에서 어떤 방식으로 처리할지 정의한다.

 이 때 사용자로부터 들어온 요청을 특정 method와 매핑하기 위해 사용되는 어노테이션이 @RequestMapping이다.

 

  • @RequestMapping은 Controller에서 사용되는데 DispatcherServlet이 Controller 파일을 찾고, 논리적 주소가 매핑된 Method를 찾기 위해서는 @Controller와 @RequestMapping이 작성되어야 한다
  • URL과 Controller의 method 매핑을 설정하는 어노테이션
  • URL 외에도 다양한 속성 지정 가능.

@RequestMapping에는 여러가지 속성들이 있는데 value와 method를 주로 사용한다.

  • value는 요청받을 URL을 설정
  • method는 어떤 요청으로 받을지 정의 (GET, POST, PUT, DELETE 등)
Controller
@RequestMapping(value = "/")
public class SampleController {
 
    @RequestMapping(value = "/getSample")
    public void getSample(HttpServletRequest request, HttpServletResponse reponse) throws Exception {        
        System.out.println("getSample");
    }
}

 

위의 예제처럼 소스 코드를 작성 후 localhost:8080/getSample 이라는 URL 요청이 올 경우 getSample 메서드가 호출된다.

 

 

https://backendcode.tistory.com/227

 

[Spring] @RequestMapping이란 그리고 동작 방식

이번 글에서는 Spring 개발 시 자주 사용하는 @RequestMapping의 개념 및 동작 방식에 대해 정리할 것입니다. [목차] 1. @RequestMapping이란? 2. @RequestMapping 작성 예시 3. @RequestMapping 동작 방식 1. @RequestMapping

backendcode.tistory.com

 

 

Maven ?


 

Maven은 자바 프로젝트의 빌드(Build)를 자동화 해주는 빌드 툴(build tool)이다. 즉, 자바 소스를 compile하고 package해서 deploy하는 일을 자동화 해주는 것이다. Maven은 pom.xml 파일에 필요한 라이브러리 목록을 설정해두면 내가 사용할 라이브러리뿐만 아니라 해당 라이브러리가 작동하는데 필요한 라이브러리까지  네트워크를 통해 자동으로 다운받아준다. 

 

 

Maven LifeCycle

 

메이븐은 프레임워크이기 때문에 동작 방식이 정해져 있고, 미리 정의하고 있는 빌드 순서가 있다. 

이를 LifeCycle이라고 한다.

 

  • Default(Build) : 일반적인 빌드 프로세스를 위한 모델
  • Clean : 빌드 시 생성되었던 파일들을 삭제하는 단계
  • Validate : 프로젝트가 올바른지 확인하고 필요한 모든 정보를 사용할 수 있는지 확인
  • Compile : 프로젝트의 소스코드를 컴파일하는 단계
  • Test : 유닛(단위) 테스트를 수행하는 단계
  • Package : 실제 컴파일된 소스 코드와 리소스들을 jar, war 등 배포를 위한 패키지로 만드는 단계
  • Verify : 통합 테스트 결과에 대한검사를 실행하여 품질 기준을 충족하는지 확인하는 단계
  • Install : 패키지를 로컬 저장소에 설치하는 단계
  • Site : 프로젝트 문서와 사이트 작성, 생성하는 단계
  • Deploy : 만들어진 패키지를 원격 저장소에 release하는 단계

최종 빌드 순서는 compile > test > package  

  1. compile : src/main/java 디렉토리 아래의 모든 소스 코드가 컴파일된다.
  2. test : src/test/java, src/test/resources 테스트 자원 복사 및 테스트 소스 코드가 컴파일된다.
  3. packaging : 컴파일과 테스트가 완료된 후 jar, war 같은 형태로 압축하는 작업.

 

Maven 설정파일

 

1. setting.xml

  • 메이븐 빌드툴과 관련한 설정파일
  • MAVEN_HOME/conf 디렉토리에 위치
  • 메이븐 빌드 시 의존 관계에 있는 라이브러리, 플러그인을 중앙저장소에서 로컬저장소(개발자 pc)로 다운로드 받게 되는데 이 때 해당 디렉토리의 위치를 setting.xml 파일에서 지정하거나 변경할 수 있다. 

2. POM(프로젝트 객체 모델)

  • POM은 pom.xml 파일을 의미한다. pom.xml은 메이븐을 이용하는 프로젝트의 root에 존재한다.
  • 메이븐의 기능을 이용하기 위해 pom이 사용된다.
  • 프로젝트는 1개의 pom.xml을 가지며 이 파일에서 프로젝트의 모든 설정과 의존성 등을 확인할 수 있다. 

 

 

 

 

https://jeong-pro.tistory.com/168

 

메이븐(Maven)은 알고 스프링(Spring)을 쓰는가? (pom.xml 분석하며 가볍게 정리하는 빌드 툴, Maven)

메이븐(Maven)은 알고 스프링(Spring)을 쓰는가? 제목과 같은 질문에 필자는 제대로 답변할 수 없었다.단순하게는 maven repository에서 dependency 추가해서 필요한 라이브러리 쓰는 정도?무엇을 위해 쓰는

jeong-pro.tistory.com

 

 

알고리즘(Algorithm)


 

어떤 문제를 해결하기 위해 정해진 일련의 절차나 방법을 공식화한 형태로 표현한 것.

일상에서의 예시를 생각하면 이해하기 쉬운데 네이버로 출발지와 도착지를 선택해 경로를 찾아 주는 것과 음식을 만드는 방법 등도 알고리즘에 속한다.

 

1. 알고리즘의 조건

 

  • 입력 : 외부에서 제공되는 자료가 0개 이상 존재해야 한다.
  • 출력 : 최소 하나 이상의 결과값이 나와야 한다.
  • 명확성 :  각 단계는 명확한 명령어로 구성되어야 하고, 모든 과정은 실행 가능한 것이어야 한다.
  • 유한성 :  명령어대로 수행했을 때 주어진 값이 처리된 후 종료되어야 한다.
  • 효과성 : 시간적, 공간적 효율성을 가져야 한다.

 

2. 좋은 알고리즘의 조건

 

  • 이해하기 쉬워야 한다.

복잡한 알고리즘은 유지보수가 어렵고, 협업 시 소통의 어려움 등 문제가 발생할 수 있다. 

  • 빠른 속도 (시간적 효율성)

실행부터 결과가 도출될 때까지의 시간이 짧을수록 좋다. 

 

  • 효율성 (공간적 효율성)

차지하는 메모리의 양이 적을수록 좋다. 하지만 속도와 메모리의 용량 중 우선순위를 두자면 속도.

 

  • 재이용 가능성

기존의 프로젝트뿐만 아니라 새로운 프로젝트에서도 사용 가능하다면 좋은 알고리즘이다.

+ Recent posts