'학습/WEB'에 해당되는 글 11건

  1. 2023.09.19[React] 23.09.19 공부 중 발견된 오류
  2. 2021.04.11인텔리제이 gradle sync failed 오류
  3. 2020.07.26[js] iterable, iterator
  4. 2018.12.17JSP
  5. 2018.10.28Spring) MVC

이전에 create-react-app으로 만들었고 잘 돌아가던 프로젝트에 npm audix fix --force 명령어를 실행해버리고 말았는데..(빨간줄이 나와서 아무생각없이 실행)

 

잘 돌아가던게 갑자기 돌아가질 않는다.

 

첫번째로 발견된 오류

무슨 말인지 모르겠어서 바로 검색을 했는데, 노드 17버전부터 적용된 OpenSSL 관련 문제인 것으로 확인.(현재 노드버전 18.16.0)

 

Node를 16버전으로 깔아둔 것 같은데 18버전으로 나오는 이유는 정확히는 모르겠고 어쨌든 프로젝트를 살리기 위해 다음 링크를 통해 해결법을 찾고 적용(https://djlee118.tistory.com/850)

 

첫번째 오류 해결

위와 같이 설정했더니 일단 기동은 되는데 새로운 오류가 발생..

 

두번째 오류

이것도 검색을 통해서 다음 링크에서 해결법을 찾고 적용(https://velog.io/@mhnormal/React-must-be-in-scope-when-using-JSX-reactreact-in-jsx-scope)

 

이후 정상적으로 기동되었다. 

 

js쪽은 오류 로그가 나와도 이해하기가 쉽지 않다..

'학습 > WEB' 카테고리의 다른 글

인텔리제이 gradle sync failed 오류  (0) 2021.04.11
[js] iterable, iterator  (0) 2020.07.26
JSP  (0) 2018.12.17
Spring) MVC  (0) 2018.10.28
spring) AOP  (0) 2018.10.25
Posted by Roktar

자바 11을 사용해서 스프링 공부를 진행하려했는데 인텔리제이 상에서는 gradle sync failed 가 나오면서 오류 발생.

JDK 문제인가해서 오라클 JDK 11 -> openJDK 11, Zulu JDK 11 등 다른 걸로 바꿔봤지만 증상 동일.

당시 사용했던 gradle 버전은 6.8.3.

 

해결

- gradle-wrapper.properties 파일에서 distributionUrl 의 값을 6.8.3에서 6.7로 변경, 버전 낮추는 것으로 해결

- 현재 세팅한 JDK는 아마존 correto 11.0.10.

- 사용되는 JDK의 버전 등 설정은 다음 위치에서 바꿀 수 있다.

'학습 > WEB' 카테고리의 다른 글

[React] 23.09.19 공부 중 발견된 오류  (0) 2023.09.19
[js] iterable, iterator  (0) 2020.07.26
JSP  (0) 2018.12.17
Spring) MVC  (0) 2018.10.28
spring) AOP  (0) 2018.10.25
Posted by Roktar

JS에서의 iterable : Symbol.iterator를 구현한 객체(array, map, set 등)

iterator: value와 done을 가진 객체를 반환하는 next 라는 이름을 가진 함수를 반환하는 객체

 

ex)

array는 Symbol.iterator를 가지고 있음.
실행하면 iterator를 반환한다.
next 함수를 통해서 value, done을 가진 객체를 반환하고, 범위를 초과할 경우 done이 true로 바뀌는 것을 확인할 수 있음.

 

'학습 > WEB' 카테고리의 다른 글

[React] 23.09.19 공부 중 발견된 오류  (0) 2023.09.19
인텔리제이 gradle sync failed 오류  (0) 2021.04.11
JSP  (0) 2018.12.17
Spring) MVC  (0) 2018.10.28
spring) AOP  (0) 2018.10.25
Posted by Roktar

JSP

JSP는 Java Server Page의 약자, 자바로 서버 페이지를 작성하기위한 언어

- HTML과 JSP태그(스크립틀릿)으로 구성되어있다.

- Server Page : 웹서버에서 실행되는 페이지를 의미하며 요청에 필요한 페이지를 위한 로직이나 데이터베이스와의 연동을 위해 필요한 모든 것들을 포함한다.

- HTML 안에 Java 코드가 삽입되는 구조.

- 보통 복잡한 로직은 서블릿에서 처리하고 JSP에서는 그 결과값만 표시한다.


<% %> = 스크립틀릿이라고 부름. 자바 코드를 사용할 때는 해당 스크립틀릿 내부에 작성한다.

ex) <% int aaa = 10; %>

<%= %> = 표현식이라고 부름. 변수의 값이나 함수의 결과값을 출력할 때 사용한다.

ex) <%=aaa%>, <%=func()%>


'학습 > WEB' 카테고리의 다른 글

인텔리제이 gradle sync failed 오류  (0) 2021.04.11
[js] iterable, iterator  (0) 2020.07.26
Spring) MVC  (0) 2018.10.28
spring) AOP  (0) 2018.10.25
spring) 객체 생성 - Java code  (0) 2018.10.24
Posted by Roktar

스프링 MVC는 모든 요청이 Dispatcher Servlet으로 간 후, Mapping 과정을 통해 요청에 적절한 Controller를 실행한다.

그렇기때문에 스프링 MVC가 웹 요청을 처리하기위해서는 Dispatcher Servlet이 등록되어있어야 한다.

Dispatcher Servlet 설정은 web.xml 파일에 등록한다.

- web.xml 파일은 tomcat 사용 시, tomcat 설치폴더/conf/web.xml 파일을 복사해서 <webapp> 태그 내부만 바꿔서 사용할 수도 있다.


MVC를 사용하기위해서 추가해야할 의존 라이브러리는 Spring WebMVC ( 해당 모듈 안에 Spring Context가 포함되어있기때문에 별도로 추가하지 않아도 된다. ) 다.


설정하기위해 사용해야하는 태그는 다음과 같다.

1) <servlet> : Dispatcher Servlet과 그 외 서블릿들을 등록할 때 사용한다.

1-1) 사용되는 태그

1-1-1) <servlet-name> : 해당 서블릿의 이름을 지정한다.

1-1-2) <servlet-class> : 해당 서블릿의 클래스 타입을 지정한다. 스프링에서 제공하는 Dispatcher Servlet 클래스가 있기때문에 이것을 지정한다.

1-1-3) <init-param> : servlet-class 태그에 해당하는 서블릿에 인자를 넘겨주는 태그.

1-1-3-1) <param-name> : 해당 클래스의 변수명을 적는다.

1-1-3-2) <param-value> : 해당 클래스의 변수에 넣을 값을 넣는다. ( 설정 xml파일 경로 등 )

1-1-2) <load-on-start-up> : 해당 클래스의 로드 우선순위를 지정한다. 낮을 수록 우선적으로 초기화된다. (선택)

1-1-3) <multipart-config> : multipart 형식의 데이터를 전송할 때 사용되는 태그. (선택)

1-1-3-1) <max-file-size> : multipart 형식의 데이터를 전송할 때 최대 크기를 지정할 수 있다.

2) <servlet-mapping> : 1)에서 등록한 서블릿을 url과 매핑한다.

2-1) <servlet-name> : 1-1-1)에서 입력한 서블릿명과 동일하게 지정한다.

2-2) <url-pattern> : 특정 url로 요청이 들어올 경우 해당 Dispatcher Servlet에 명령이 도착할 수 있도록 지정한다. (정규식 사용)


합치면 하나의 Dispatcher Servlet을 등록하는 태그는 다음과 같아진다.

[ web.xml ]

    <servlet>

        <servlet-name>req</servlet-name>

        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>

        <init-param>

            <param-name>contextConfigLocation</param-name>

            <param-value>/WEB-INF/spring/req-servlet.xml</param-value>

// 2개 이상의 파일을 참조할 때는 <param-value> 태그의 내용을 다음처럼 줄단위로 구분하거나 쉼표로 구분하면 된다.

<param-value>

/WEB-INF/spring/req-servlet.xml

/WEB-INF/spring/req-cont.xml

</param-value>

        </init-param>

        <load-on-startup>2</load-on-startup>

        <multipart-config>

            <max-file-size>5000000</max-file-size>

        </multipart-config>

    </servlet>

    <servlet-mapping>

        <servlet-name>req</servlet-name>

        <url-pattern>/req/*</url-pattern>

    </servlet-mapping>


기본문자열을 UTF-8로 바꾸기위해서는 스프링이 제공하는 CharcterEncodingFilter 클래스를 filter로 등록하면 된다.

[web.xml] 
   <filter>
        <filter-name>CharacterEncodingFilter</filter-name>
        <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
        <init-param>
            <param-name>encoding</param-name>
            <param-value>UTF-8</param-value>
        </init-param>
    </filter>
    <filter-mapping>
        <filter-name>CharacterEncodingFilter</filter-name>
        <url-pattern>/*</url-pattern> // 모든 경로에 대해 필터를 적용
    </filter-mapping>

servlet과 마찬가지로 <filter> -> <filter-mapping> 순으로 등록하는 것을 볼 수 있다.


req-servlet.xml 파일은 기존에 사용했던 설정 xml파일을 등록하면 된다. 빈객체 관리는 Dispatcher Servlet의 param-value 태그에 넘기는 xml파일에서 관리하면 된다.

[req-servlet.xml]

<beans xmlns="http://www.springframework.org/schema/beans"

xmlns:mvc="http://www.springframework.org/schema/mvc"

xsi:schemaLocation=" .....

http://www.springframework.org/schema/mvc

http://www.springframework.org/schema/mvc/spring-mvc.xsd">


<mvc:annotation-driven/> // MVC 관련 어노테이션을 처리하기위해서는 해당 태그를 작성해야한다.


</beans>


위와 같은 작업을 통해 req라는 이름을 가진 Dispatcher Servlet이 등록됐다.




컨트롤러 클래스는 @RequestMapping을 통해 url과 매핑한다. Dispatcher Servlet은 이런 컨트롤러들을 찾아서 연결해주는 역할을 한다.

Controller 클래스는 사용자의 웹요청을 처리하고 그 결과를 View로 전달하는 클래스다.

[ReqController1.java]

import ...


@Controller

public class ReqController1 {


@RequestMapping("/method1")

public void method1() {

System.out.println("method1()");

}


@RequestMapping(value="/method2", method=RequestMethod.GET)

public void method2() {

System.out.println("method2()");

} // GET 요청에서만 작동하는 메소드


@GetMapping("/method3")

public void method3() {

System.out.println("method3()");

} // GET 요청에서만 작동하는 메소드

}

위 컨트롤러는 url이 ../req/method1일 경우 method1 메소드가 호출되고 ../reg/method2일 경우 method2 메소드가 호출된다.

단, method 속성에 RequestMethod 클래스의 상수값(GET, POST, PUT, DELETE)을 넘겨주면 특정 요청방식에 따라서만 실행되도록 지정할 수 있다.

혹은 스프링 5.1 이상의 버전이라면 GetMapping이나 PostMapping 등의 어노테이션을 사용할 수 있다.




스프링 MVC의 동작은 다음과 같다.

1) 웹브라우저로부터 요청이 들어온다. (웹브라우저 -> Dispatcher Servlet)

2) 디스패처 서블릿은 적절한 컨트롤러를 찾는다. 단, 디스패처 서블릿이 직접 검색하지않고 HandlerMapping이라는 빈객체를 통해 컨트롤러를 검색한다.(Dispatcher Servlet -> HandlerMapping)

3) HandlerMapping 빈객체는 클라이언트의 요청경로를 사용하여 해당 요청을 처리할 컨트롤러 빈객체를 디스패처 서블릿으로 전달한다. (HandlerMapping -> Dispatcher Servlet)

4) 디스패처 서블릿은 HandlerMapping이 찾아준 컨트롤러 객체를 처리할 수 있는 HandlerAdapter 빈에게 요청 처리를 위임한다.

    HandlerAdapter는 해당 컨트롤러에서 요청과 일치하는 메소드를 실행하고 그 결과를 디스패처 서블릿으로 전달한다. (Dispatcher -> HandlerAdapter -> Dispatcher>

5) 디스패처 서블릿은 그 결과를 웹브라우저로 반환한다.

5-1) JSP를 사용하는 경우, 특정 저장소(request, session, pagecontext, model 등)에 데이터를 저장해둔 후 ViewResolver를 통해서 적절한 view를 선택하고 그 view에 데이터를 사용하여 화면을 구성한 후 클라이언트로 그 view를 전달한다. ViewResolver를 사용하지 않아도 직접 view를 선택할 수 있다.

5-2) 데이터만 보내는 경우 json 형태로 변형하여 view로 데이터를 보낸다. 객체를 json 형태로 바꿔주는 라이브러리를 사용하면 단순히 객체를 반환함으로 json 형태로 만들어 보낼 수 있다. ex) GSON, Jackson 라이브러리 등



'학습 > WEB' 카테고리의 다른 글

[js] iterable, iterator  (0) 2020.07.26
JSP  (0) 2018.12.17
spring) AOP  (0) 2018.10.25
spring) 객체 생성 - Java code  (0) 2018.10.24
spring) 의존 자동주입  (0) 2018.10.20
Posted by Roktar