728x90
반응형

SpringFramework 63

Spring legacy - 클래스파일 경로에 있는 xml 파일 빌드 (인텔리제이 혹은 배포)

context.xml파일 일반적으로 classpath는 src/main이다. src/main 하위에서 java 혹은 resources 두갈래로 갈린다. 우리는 java 파일이 존재하는 경로에 mapper.xml을 저장할 예정이므로 groupID와 artifactID를 포함한 도메인 경로와 파일이 실제로 존재하는 하위 디렉토리 로 경로를 지정한다. pom.xml파일 src/main/java **/*.xml src/main/resources **/*.* 위 xml로드 부분인 resources코드를 추가하면 src/main/java에 존재하는 모든 xml파일을 컴파일 한다. STS에서는 일반적으로 위 코드를 하지 않더라도 컴파일과정을 거쳐 빌드 된 후 톰캣에 배포된다. 하지만 인텔리제이에서는 위 코드가 생략되..

SpringFramework 2024.02.19

Spring 한개 이상 - 복수개의 properties파일 로드 안되는 현상

1. 서로 다른 두개 이상의 Context파일에 서로 다른 복수개의 properties파일을 로드한다고 가정한다. ignore-unresolvable="true" 위 속성을 추가해야 한다. 만약 해당 속성을 추가하지 않는다면, 우선순위가 높은 설정파일에만 적용이 된다. 2. 하나의 Context파일에 서로 다른 복수개의 properties파일을 로드한다고 가정한다. order="1" ignore-unresolvable="true" 위와 같이 order속성과 ignore-unresolvable 속성을 함께 추가해야한다.

SpringFramework 2024.02.18

Spring Legacy Mybatis Execute Query 콘솔출력

Maven Dependency를 추가한다. [ log4j2-jdbc4.1 ]을 추가한다. org.bgee.log4jdbc-log4j2 log4jdbc-log4j2-jdbc4.1 1.16 [ log4jdbc.log4j2.properties ] 파일 추가 log4jdbc.spylogdelegator.name=net.sf.log4jdbc.log.slf4j.Slf4jSpyLogDelegator log4jdbc.dump.sql.maxlinelength=0 JDBC Driver 설정에 대한 Properties 파일을 아래와 같이 변경한다. /* [오라클] */ // 변경 이전 값 oracle.driver=oracle.jdbc.driver.OracleDriver oracle.url=jdbc:oracle:thin:@5..

SpringFramework 2024.02.18

JSON표준 규약 에 의한 javascirpt -> spring 간의 REST(fetch, ajax, axios)통신에서 null과 undefined 부정 타입 변환

[예시 1. null] useEffect(()=>{ let params = {params: {"test":null}} axios.get('/test', params) .then((response)=> { console.log(response) }) .catch((error) => { console.log(error); }) }) @GetMapping("/test") public void test(String test) { System.out.println(test.equals("null")); } [예시 2. undefined] useEffect(()=>{ let params = {params: {"test":undefined}} axios.get('/test', params) .then((respons..

[Swagger3] spring doc 2.1.0 설정 및 Map<String,Object> 스키마

swagger3는 SpringBoot3._버전에서 사용이 가능하고 SpringBoot2._ 버전에서는 사용이 불가능하다 SpringBoot2._ 버전에 적용할경우 아래 오류 발생. org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'org.springframework.boot.autoconfigure.web.servlet.WebMvcAutoConfiguration$EnableWebMvcConfiguration': Unsatisfied dependency expressed through method 'setConfigurers' parameter 0; nested exception is..

SpringFramework 2023.07.27

SpringData에서 제공하는 Pageable에 대한 잘못된 블로그 포스팅

SpringFramework에서 제공하는 Pageable과 PageRequest에 대해 여러 블로그 포스팅글들을 보면 Spring Data JPA에서 제공하는 기능이라는 잘못된 정보의 포스팅 글들을 볼 수 있습니다.(분명 어느 인강에서 잘못 설명했거나, 급하게 혹은 잘못 이해된 것으로 판단됩니다.) 우선 PageRequest란 Pageable을 구현한 AbstractPageRequet클래스를 상속받은 클래스입니다. 상세한 설명은 넘어가고 PageRequest와 Pageable은 Spring 프로젝트에서 Pagenation을 쉽게 처리할 수 있는 기능을 지원해주는데요. 해당 인터페이스와 클래스는 흔히 알고있는 Spring Data JPA에서 제공해 주는것이 아닌 Spring Data JPA를 제공하는 모델..

SpringFramework 2023.02.20

SLF4J Logback 설정 및 전역 컨트롤러 선언

public class logBackController { private final Logger LOGGER = LoggerFactory.getLogger(SwaggerController.class); @GetMapping("/logExam") public String getLogExam(String name) { LOGGER.info("로그 테스트 : "+ name); LOGGER.info("로그 테스트 : {}", name); return name; } } 기본적으로 XML파일 명을 logback-spring.xml로 지정하면 스프링에서 읽어들입니다. INFO [%d{yyyy-MM-dd HH:mm:ss.SSS}] [%-5level] [%thread] %logger LogOutPut : %msg%n 5..

SpringFramework 2022.11.20

[Swagger2] SpringBoot 설정 및 적용

Swagger Controller의 각 메서드에 해당하는 API를 개발하기 위해서는 명세를 관리해야 하는데, 이때 명세란 해당 API가 어떤 로직을 수행하는지 설명하고 이 로직을 수행하기 위해 어떤 값을 요청하며, 그에 따른 응답값으로는 무엇을 받을 수 있는지를 정리한 자료입니다. API는 개발 과정에서 계속 변경되므로 작성한 명세 문서도 주기적인 업데이트가 필요합니다. 또한 명세 작업은 번거롭고 시간 또한 오래걸리는데, 이와 같은 문제를 해결하기 위해 Swagger 라는 오픈소스 프로젝트를 활용할 수 있습니다. 또한 API 명세 뿐만 아니라Talend API Tester 혹은 PostMan을 주로 사용하는데 이를 대체하여 명세기능을 수행하는 Swagger에서 이를 대체하여 테스트를 진행할 수 도 있습니..

Spring에서 정수형 Parameter의 타입인 int, Integer 사용 차이

Parameter값이 null 인 경우가 있다. 이때 컨트롤러에서 정수형 값으로 받는다고 가정한다면 int 타입은 null을 저장할 수 없기 때문에 오류가 발생한다. 따라서 null이 들어올 수 있는 상황에서는 Wrapper 형식인 Integer로 받는다. @GetMapping("/") public String list(int page, String condition, String keyword, SearchVO search, HttpServletRequest request, Model model, RedirectAttributes ra) {} 위와 같은 메서드로 코드가 짜여있을때 해당 URL이 https://u-it.tistory.com/ 라고 가정하고 접속을 한다면 메서드에서 자동으로 page라는 n..

[자동로그인]Interceptor 활용 자동로그인 ,로그아웃 구현 예제 로직 및 과정 vol.2

쿠키를 통해서 세션아이디와 일치하는, '자동로그인 했던 회원의 정보' 를 불러온 뒤 다시한번 세션에 저장해버리는 로직을 구현 하기위해, 불러온 회원 정보를 어딘가에 재활용 할수있도록 보관해야합니다. 바로 DB에 보관해야합니다. DB에 쿠키의 만료시간과 쿠키의 값을 함께 저장하겠습니다. sql을추가해서 컬럼을 2개 추가합니다. alter table mvc_user ADD session_id varchar(80) default 'none' not null; alter table mvc_user add limit_time date; 자동로그인 하지 않은사람은 default값으로 none이 저장 됩니다. 다음으로는 VO에는 DB에추가한 컬럼을 필드에 추가한 후 public class UserVO { /*이전필드..

[자동로그인]session&cookie 활용 자동로그인 구현 예제 로직 및 과정 vol.1

$("#signIn-btn").click(function() { //자동로그인 반환할 변수 const autoLogin = $('input[name=autoLogin]').is(":checked"); console.log("auto : "+autoLogin); const userInfo = { autoLogin : autoLogin }; $.ajax({ type: "POST", url: "/user/loginCheck", headers: { "Content-Type": "application/json" }, data: JSON.stringify(userInfo), dataType : "text", success: function(data) { } }); }); 체크박스에 접근하여 논리값을 리턴해보도록 합..

쿠키와세션,인터셉터를 활용한 자동로그인 개념 설명

자동로그인 브라우저창을 종료 하거나 세션의 유효시간이 만료가 된다면 세션내부의 로그인 데이터가 사라지게됩니다. 세션에는 고유 ID가 있는데 그것이 사라지고 새로 브라우저를 킨다면 새로운 고유 ID를 가진 세션객체가 생성됩니다. 이 상태로는 로그인 한 데이터가 없기 때문에 사용자가 재로그인 할 수밖에 없습니다. 네이버같은 경우 자동로그인 하지 않고 로그인했다가 브라우저를 껐다 키면 재로그인 해야하는 경험과 같습니다. 자동로그인 구현 자동로그인을 체크 했을때 클라이언트 측에서 서버로 자동로그인이 체크 되었다는 증거를 추가로 넘겨줍니다. 서버에서 해당 증거를 확인하게되면 자동로그인에 관한 처리를 수행합니다. 체크값에 대해서 체크가 되었다 안되었다 정도로 판단하면 되므로 논리값으로 처리하면 될것입니다. 체크가 ..

[ Interceptor ] 게시판 session 회원 권한 검증 실습 로직

public class BoardInterceptor extends HandlerInterceptorAdapter{ @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { System.out.println("게시판 인터셉터 발동!"); //BoardController쪽으로 들어갈 요청이 회원인지 아닌지 먼저 확인 HttpSession session = request.getSession(); if(session.getAttribute("login") == null) { System.out.println("회원 인증 실패!"); //re..

[Interceptor] 세션검증 공통코드 처리 정리 및 예시

Interceptor Interceptor는 Controller를매핑하기 전에 DispatcherServlet과 Controller 사이에 두는것이 Interceptor라는 장벽입니다. 우리가 BoardController라고 했을 때, BoardController의 어떠한 요청에 진입할때 Interceptor로 제한을 걸수 있게됩니다. 즉, Interceptor의 역할을 기능제한을 수행하는것 입니다. Interceptor의뜻인 중간에 탈취한다 는 뜻과 연관이있습니다. DispatcherServlet이 글쓰기요청을 받는다면 BoardController에서 일일히 글쓰기에대한 메서드, 글수정에대한 메서드, 글삭제에대한 메서드에서 세션검증에대한 코드를 각각 넣어줘야 할 텐데 공통적인 코드이므로 Intercep..