https://tech.inflab.com/20230404-test-code/

 

테스트 코드를 왜 그리고 어떻게 작성해야 할까?

테스트 코드가 필요한 이유와 잘 작성하는 방법에 대해 공유합니다.

tech.inflab.com

 참고

Ajax(Asynchronous JavaScript and XML)란?


 

Ajax는 비동기적으로 웹 서버와 브라우저 간에 데이터를 교환하기 위한 기술이다. 이 기술은 웹 페이지를 다시 로드하지 않고도 동적으로 데이터를 가져오거나 전송할 수 있게 해준다.

 

*비동기 방식이란?

웹페이지를 리로드 하지 않고 데이터를 불러오는 방식이다. 비동기 방식을 이용하면 필요한 데이터만 불러올 수 있기 때문에 불필요한 리소스 낭비를 줄일 수 있다.

 

Ajax는 XMLHttpRequest 객체를 통해 서버에 request 한다.

JSON이나 XML 형태로 필요한 데이터만 받아 갱신하기 때문에 그만큼 자원과 시간을 아낄 수 있다.

 

장점

  • Ajax 요청은 비동기적으로 발생하기 때문에 요청이 완료될 때까지 기다리지 않고 처리가 가능하다.
  • 웹 페이지가 다시 로드되지 않고도 데이터를 비동기적으로 가져와 화면을 업데이트 할 수 있으므로 빠른 상호 작용이 가능하다.
  • 전체 페이지를 다시 로드할 필요가 없어 서버 부하를 줄일 수 있다.

단점

  • 브라우저와 서버 간 데이터를 주고받기 때문에 보안상 문제가 발생할 수 있다. 사용자 입력을 서버로 보내는 경우 데이터 유효성을 검증하고 보안을 강화해야 한다.
  • 연속으로 데이터 요청 시 서버 과부하가 발생할 수 있다.
  • 일부만 동적으로 업데이트되기 때문에 검색 엔진이 페이지의 전체 내용을 색인인하기 어려울 수 있다.

작동순서

  1. 웹 페이지에서 JavaScript를 사용하여 XMLHttpRequest 객체를 생성
  2. XMLHttpRequest 객체를 사용하여 서버에 비동기식 요청 전송
  3. 서버는 요청을 처리하고, 처리 결과를 웹페이지로 재전송
  4. 웹 페이지에서 JavaScript를 사용하여 처리 결과를 받아, 페이지의 특정 부분을 업데이트

Ajax 문법 (JQuery 사용)

        $.ajax({    
        
           url      : "/board/getBoardList",
           data     : $("#boardForm").serialize(),
           dataType : "JSON",
           cache    : false,
           async    : true,
           type     : "POST",    
           success  : function(obj) {
                getBoardListCallback(obj);                
            },           
           error    : function(xhr, status, error) {}
            
         });
    }

 

  • url : Ajax로 요청할 대상 URL 지정
  • data : 요청에 포함될 데이터 지정
  • dataType : 서버에 반환되는 데이터 타입 지정
  • cache : 요청 결과를 캐시할지 여부
  • async : 요청을 비동기적으로 처리할지 여부
  • type : Ajax 요청의 HTTP 메서드 지정. GET 또는 POST 지정
  • success : Ajax 요청 성공 시 호출될 콜백 함수 지정
  • error(xhr, status, error) : Ajax 요청 실패 시 호출될 콜백 함수 지정

 

 

 

자세한 설명 (+AJAX란, JQuery-Ajax 사용법 등)

https://mundol-colynn.tistory.com/75

 

에러 : origin 서버가 대상 리소스를 위한 현재의 representation을 찾지 못했거나, 
그것이 존재하는지를 밝히려 하지 않습니다.

 

이 에러가 계속 내 플젝진행을 방해했다.

기존 플젝을 이 에러때문에 다시 진행했는데 같은 파트에서 또 막혔다. path 설정도 안 먹히고 저 에러 검색해서 나오는 모든 설정이 안 먹히는 상황이었으며 MySQL 버전 문제 때문에 변경된 class .cj 추가 입력했다고 

jdbc 드라이버 [cohttp://m.mysql.cj.jdbc.driver]을(를) 등록했지만, 웹 애플리케이션이 중지될 때, 
해당 jdbc 드라이버의 등록을 제거하지 못했습니다. 메모리 누수를 방지하기 위하여, 등록을 강제로 제거했습니다.

 

이 에러까지  나는 상황이었으며 server도 이상한 그야말로 총체적 난국인 상황이었다. 거의 3시간을 붙잡고 있다가  답답해서 코드를 하나하나 뜯어보고 있었다. 원인이 MySQL 때문인지 서버 이상 때문인지도 모르겠고

불허되는 접근: 이 웹 애플리케이션 인스턴스는 이미 중지되었습니다.

 

단순히 404 에러인가 하면 해결방법을 전부 시도해도 해결되지 않았다. 그러다 혹시 mapper 문제인가? (전에도 매핑문제로 시간 오래 잡아먹음) 싶어서 root-context.xml 설정 검색하는데 해당 파일에서 mapperLocations의 classpath를 classpath*로 설정해야 모든 매핑이 순조롭다고 해서 그 부분을 수정했다.

수정 후 콘솔을 보니

org.springframework.web.servlet.pagenotfound 
- no mapping found for http request with uri [/board/] in dispatcherservlet with name 'appservlet'

 

이 에러가 떴다. 신났다. 해결해본 경험이 있는 에러였다. 왠지 고지가 눈앞에 있는 것 같았다.

해당 에러는 servlet-context.xml 파일에 

<resources mapping="/ad_assets/**" location="/resources/ad_assets/" />

 

이 부분을 추가 설정하면 해결된다.

 

허무하지만 해결돼서 신난다. 오늘 밤새워서라도 해결할 생각이었는데 생각보다 일찍 해결돼서 기쁘다.

 

 

내일 일어나서 할 일

 

- context.xml 파일에 저 부분이 어떤 의미인지

- mapping 파고들기

- classpath 설정 파고들기

 

 

classpath* 설정에 대한 참고 사이트

https://docs.spring.io/spring-framework/docs/current/javadoc-api/org/springframework/core/io/support/PathMatchingResourcePatternResolver.html

 

PathMatchingResourcePatternResolver (Spring Framework 6.1.8 API)

Find all resources that match the given location pattern via the Ant-style PathMatcher. Supports resources in OSGi bundles, JBoss VFS, jar files, zip files, and file systems.

docs.spring.io

https://pplenty.tistory.com/5

 

[Spring] classpath: vs classpath*:

spring classpath: vs classpath*: 이슈 Invalid bound statement (not found) 웹 어플리케이션을 리팩토링하고, 모듈 별로 분리하는 작업을 하는 과정에서 mapperLocations 에 설정된 mapper xml 을 읽지 못하고 Exception 을

pplenty.tistory.com

 

 

 

에러 :  '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>

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

 

 

 

 

에러 : 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 창에서 값 확인

 

알고리즘(Algorithm)


 

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

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

 

1. 알고리즘의 조건

 

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

 

2. 좋은 알고리즘의 조건

 

  • 이해하기 쉬워야 한다.

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

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

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

 

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

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

 

  • 재이용 가능성

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

[서버 에러]server tomcat v8.5 server at localhost failed to start.


 

<에러>  
[서버 에러]server tomcat v8.5 server at localhost failed to start.

 

<해결>

Preferences > Java > Installed JREs > 기존 jdk Remove 해주고 Add로 환경변수 설정된 jdk 재설정
Preferences > Servers > Runtile Environments > 서버 Edit > 설정된 JRE 선택

이렇게 해도 해결되지 않으면

추가된 서버 더블클릭 후 Server Options 에서 Publish module contexts to separate XML files 체크

 

*publish module contexts to separate xml files 

이클립스에서 환경설정이나 xml 파일 설정시 실제 tomcat 서버와 동기화 시켜주는 옵션

보통 서버 기본 세팅시 설정

'Backend > 기타' 카테고리의 다른 글

JUnit 단위 테스트  (0) 2024.06.03
알고리즘(Algorithm)이란?  (0) 2024.06.02
<url-pattern>  (0) 2024.05.31
[Spring] 한글깨짐 에러  (0) 2024.05.31
[Spring] invalid thread access, download of template~ 에러  (1) 2024.05.31

+ Recent posts