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

 

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

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

tech.inflab.com

 참고

https://www.inflearn.com/course/%EC%8A%A4%ED%94%84%EB%A7%81-%ED%95%B5%EC%8B%AC-%EC%9B%90%EB%A6%AC-%EA%B8%B0%EB%B3%B8%ED%8E%B8#curriculum

 

스프링 핵심 원리 - 기본편 | 김영한 - 인프런

김영한 | 스프링 입문자가 예제를 만들어가면서 스프링의 핵심 원리를 이해하고, 스프링 기본기를 확실히 다질 수 있습니다., 스프링 핵심 원리를 이해하고, 성장하는 백엔드 개발자가 되어보

www.inflearn.com

 

https://www.inflearn.com/course/%EC%8A%A4%ED%94%84%EB%A7%81-%EC%9E%85%EB%AC%B8-%EC%8A%A4%ED%94%84%EB%A7%81%EB%B6%80%ED%8A%B8

 

[지금 무료] 스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술 | 김영한 - 인프런

김영한 | 스프링 입문자가 예제를 만들어가면서 스프링 웹 애플리케이션 개발 전반을 빠르게 학습할 수 있습니다., 스프링 학습 첫 길잡이! 개발 공부의 길을 잃지 않도록 도와드립니다. 📣 확

www.inflearn.com

 

 

https://mangkyu.tistory.com/75

https://youwjune.tistory.com/43

 

 

 

더미 데이터 넣기

꼭 모든 컬럼에 데이터를 넣을 필요없고 나의 경우엔 작성자/제목/내용 컬럼만 입력 후 값을 입력해줬다.

INSERT INTO 테이블명 (컬럼1, 컬럼2, 컬럼3, 컬럼4, 컬럼5 ...) 
VALUES("넣고싶은", "데이터를", "컬럼에", "맞게", "넣으시오");
추가로 다른 데이터 넣어주면 됨;

 

이 외에 프로시저를 이용하는 방법 등 다양한데 다음에 정리해보겠다.

 

https://soopeach.tistory.com/119

 

 

메인 페이지에서 로그인 버튼을 누르면 로그인 폼만 나오는 게 아니라 헤더나 어사이드 부분은 그대로 유지하되 메인 부분만 로그인 창으로 변경되게 하고 싶었다. 이를 위해서는 두 가지 방법을 사용할 수 있다.

 

JavaScript 및 AJAX 사용 

로그인 버튼 클릭 시 JavaScript를 사용하여 AJAX 요청을 보내고 서버에서 로그인 폼을 받아와 메인 페이지의 특정 부분에 동적으로 추가한다.

 

이러한 방식의 문제점은 html의 요소를 문자로 다루기 때문에 홑따옴표와 쌍따옴표가 너저분하게 깔려있어서 알아보기도 힘들고 코딩하기는 더더욱힘들며 그 여파로 유지보수가 굉장히 힘들다라는 단점이 있다. 이 스파게티 소스는 종지부에는 본인이 만든 것도 헷갈리게 되는 현상이 발생한다.

 

서버 측 템플릿 이용

Spring MVC 또는 Thymeleaf와 같은 서버 측 템플릿 엔진을 사용해 메인 페이지를 생성할 때, 메인 페이지와 로그인 폼을 포함한 다른 페이지를 따로 생성하고, 로그인 버튼을 누를 때만 해당 부분을 로드하여 메인 페이지에 추가할 수 있다.

 

 

참고 페이지(+템플릿 사용의 자세한 설명)

https://stir.tistory.com/316

 

 

 

https://jaehoney.tistory.com/234

 

Real MySQL - Limit, Offset 절의 동작 원리! (+ No Offset 성능 비교)

LIMIT Limit 절은 쿼리 결과에서 지정된 순서에 위치한 레코드만 가져오고자 할 때 사용한다. 아래의 예제를 보자. SELECT * FROM employees WHERE emp_no BETWEEN 10001 AND 10010 ORDER BY first_name LIMIT 0, 5; 위의 쿼리

jaehoney.tistory.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

Classpath* 설정에 대해


https://developer-joe.tistory.com/225

 

Spring의 classpath:의 경로 위치

아래 Spring web.xml의 ContextLoaderListener의 환경설정 파일인 applicationContext.xml의 위치를 지정하는 코드에서 classpath:의 위치가 어디인가? contextConfigLocation classpath:applicationContext.xml org.springframework.web.cont

developer-joe.tistory.com

 

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

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

 

 

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

 

+ Recent posts