Spring/Study 2020. 4. 21. 23:08

(공감과 댓글 하나는 글쓴이에게 큰 힘이 됩니다.)

 

스프링 부트(Spring Boot)는 상용화 가능한 제품 수준의 스프링 기반 애플리케션을 만들 때 빠르고, 쉽게 만들 수 있도록 도와준다.

 

1. Create New Project 클릭

2. 좌측의 Maven 선택 후 Next 클릭

3. Name, GroupId, ArtifactId 입력 후 Finish 클릭

4. pom.xml에 <parent>, <dependency>, <build> 추가

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
 
    <groupId>com.moomini</groupId>
    <artifactId>spring-boot-getting-started</artifactId>
    <version>1.0-SNAPSHOT</version>
 
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.2.6.RELEASE</version>
    </parent>
 
    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
    </dependencies>
 
    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>
</project>
cs

5. src\main\java 디렉토리를 생성하고, 그 안에 패키지 폴더 생성 후 Application.java 생성

6. Application.java에 @SpringBootApplication 어노테이션을 추가하고, 메인메소드에서 run 입력 후 실행

package com.moomini;
 
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
 
@SpringBootApplication
public class Application {
    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }
}
cs

7. localhost:8080에 접속해서 에러페이지가 정상적으로 표시되는 것 확인

posted by DevMoomin
:
Spring/Study 2020. 4. 19. 18:21

(공감과 댓글 하나는 글쓴이에게 큰 힘이 됩니다.)

 

커텍션풀은 데이터베이스 연결을 미리 준비해놓고 사용하는 것으로, 서버의 부하를 최소화 할 수 있다.

 

C2p0 모듈의 ComboPooledDataSource

- 예외처리가 반드시 필요

MemberDao.java

@Repository
public class MemberDao implements IMemberDao {
    private String driver = "oracle.jdbc.driver.OracleDriver";
    private String url = "jdbc:oracle:thin:@localhost:1521:xe";
    private String userid = "scott";
    private String userpw = "tiger";
 
    private ComboPooledDataSource dataSource;
    private JdbcTemplate template;
    
    public MemberDao() {
        dataSource = new ComboPooledDataSource();
        
        try {
            dataSource.setDriverClass(driver);
            dataSource.setJdbcUrl(url);
            dataSource.setUser(userid);
            dataSource.setPassword(userpw);
        } catch (PropertyVetoException e) {
            e.printStackTrace();
        }
        
        template = new JdbcTemplate();
        template.setDataSource(dataSource);
    }
}
cs

 

 

스프링 설정파일을 이용한 DataSource 설정

servlet-context.xml

<beans:bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
    <beans:property name="driverClass" value="oracle.jdbc.driver.OracleDriver" />
    <beans:property name="jdbcUrl" value="jdbc:oracle:thin:@localhost:1521:xe" />
    <beans:property name="user" value="scott" />
    <beans:property name="password" value="tiger" />
    <beans:property name="maxPoolSize" value="200" />
    <beans:property name="checkoutTimeout" value="60000" />
    <beans:property name="maxIdleTime" value="1800" />
    <beans:property name="idleConnectionTestPeriod" value="600" />
</beans:bean>
cs

MemberDao.java

@Repository

public class MemberDao implements IMemberDao {

 

    private JdbcTemplate template;

    

    @Autowired

    public MemberDao(ComboPooledDataSource dataSource) {

        this.template = new JdbcTemplate(dataSource);

    }

}

Colored by Color Scripter

cs

posted by DevMoomin
:
Spring/Study 2020. 4. 19. 18:09

(공감과 댓글 하나는 글쓴이에게 큰 힘이 됩니다.)

 

데이터베이스와 통신을 하기 위해서는 드라이버 로딩, DB 연결, 자원 해제의 작업들을 반복적으로 입력해 주어야 했다. JdbcTemplate은 이러한 작업들을 스프링 프레임워크에서 자동으로 처리하게 하여 JDBC의 단점을 보완하기 위해 사용한다. 데이터베이스 연결과 관련된 정보를 가지고 있는 DataSource는 스프링 또는 c3p0에서 제공하는 클래스를 이용할 수 있다.

 

 

pom.xml

<dependency>
    <groupId>com.oracle</groupId>
    <artifactId>ojdbc6</artifactId>
    <version>12.1.0.2</version>
</dependency>
<dependency>
    <groupId>com.mchange</groupId>
    <artifactId>c3p0</artifactId>
    <version>0.9.5</version>
</dependency>
<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-jdbc</artifactId>
    <version>4.1.6.RELEASE</version>
</dependency>
cs

 

MemberDao.java (c3p0 이용)

@Repository
public class MemberDao implements IMemberDao {
    private String driver = "oracle.jdbc.driver.OracleDriver";
    private String url = "jdbc:oracle:thin:@localhost:1521:orcl";
    private String userid = "moomini";
    private String userpw = "1234";
  
    private DriverManagerDataSource dataSource;
    private JdbcTemplate template;
 
    public MemberDao() {
        dataSource = new DriverManagerDataSource();
        dataSource.setDriverClass(driver);
        dataSource.setJdbcUrl(url);
        dataSource.setUser(userid);
        dataSource.setPassword(userpw);
 
        template = new JdbcTemplate();
        template.setDataSource(dataSource);
    }
 
    @Override
    public int memberInsert(final Member member) {
        int result = 0;
 
        final String sql = "INSERT INTO member (memId, memPw, memMail) values (?,?,?)";  
 
        result = template.update(sql, new PreparedStatementSetter() {
            @Override
            public void setValues(PreparedStatement pstmt) throws SQLException {
                pstmt.setString(1, member.getMemId());
                pstmt.setString(2, member.getMemPw());
                pstmt.setString(3, member.getMemMail());
            }
        });
        return result;
    }
}
cs
posted by DevMoomin
:
Spring/Study 2020. 4. 19. 17:27

(공감과 댓글 하나는 글쓴이에게 큰 힘이 됩니다.)

 

JDBC란 Java Database Connectivity의 약자로, 자바에서 데이터베이스에 접속할 수 있도록 하는 자바 API이다.

 

 

MemberDao.java

@Repository
public class MemberDao implements IMemberDao {
    private String driver = "oracle.jdbc.driver.OracleDriver";
    private String url = "jdbc:oracle:thin:@localhost:1521:xe";
    private String userid = "scott";
    private String userpw = "tiger";
    
    private Connection conn = null;
    private PreparedStatement pstmt = null;
    private ResultSet rs = null;
    
    @Override
    public int memberInsert(Member member) {
        int result = 0;
        
        try {
            // 드라이버 로딩
            Class.forName(driver);
            
            // 연결
            conn = DriverManager.getConnection(url,userid, userpw);
            String sql = "INSERT INTO member (memId, memPw, memMail) values (?,?,?)";
            
            // SQL 쿼리 준비
            pstmt = conn.prepareStatement(sql);
            
            // 데이터 바인딩
            pstmt.setString(1, member.getMemId());
            pstmt.setString(2, member.getMemPw());
            pstmt.setString(3, member.getMemMail());
            
            // 쿼리실행 및 결과 처리
            result = pstmt.executeUpdate();
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        } catch (SQLException e) {
            e.printStackTrace();
        } finally {
            try {
                // 자원해제
                if(pstmt != null) pstmt.close();
                if(conn != null) conn.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
        
        return result;
    }
}

Colored by Color Scripter

cs

posted by DevMoomin
:
Spring/Study 2020. 4. 18. 21:28

(공감과 댓글 하나는 글쓴이에게 큰 힘이 됩니다.)

 

리다이렉트(Redirect)

- 리다이렉트(Redirect)는 컨트롤러에서 뷰를 분기하는 방법으로, 현재 페이지에서 특정 페이지로 전환하는 기능이다.

Model

@RequestMapping(value = "/modifyForm")
public String modifyForm(Model model, HttpServletRequest request) {
    HttpSession session = request.getSession();
    Member member = (Member) session.getAttribute("member");
        
    if(null == member) return "redirect:/";
    else model.addAttribute("member", service.memberSearch(member));
        
    return "/member/modifyForm";
}
cs

ModelAndView

@RequestMapping("/removeForm")
public ModelAndView removeForm(HttpServletRequest request) {
    ModelAndView mav = new ModelAndView();
        
    HttpSession session =  request.getSession();
    Member member = (Member) session.getAttribute("member");
        
    if(null == member) {
        mav.setViewName("redirect:/");
    } else {
        mav.addObject("member", member);
        mav.setViewName("/member/removeForm");
    }    
 
    return mav;
}
cs

 

 

인터셉트(Intercept)

- 리다이렉트를 사용해야 하는 경우가 많은 경우 HandlerInterceptor를 이용하여 효율적으로 관리할 수 있다.

- preHandle() : Controller 작업 전

- postHandle() : Controller 작업 후

- afterCompletion() : Controller와 View 작업 후

MemberLoginInterceptor.java

public class MemberLoginInterceptor extends HandlerInterceptorAdapter {
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        HttpSession session = request.getSession(false);
 
        if(session != null) {
            Object obj = session.getAttribute("member");
            if(obj != nullreturn true;
        }
        
        response.sendRedirect(request.getContextPath() + "/");
        return false;
    }
    
    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
        super.postHandle(request, response, handler, modelAndView);
    }
    
    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
        super.afterCompletion(request, response, handler, ex);
    }
}
cs

servlet-context.xml (2개의 방법 모두 사용가능)

<interceptors>
    <interceptor>
        <mapping path="/member/modifyForm"/>
        <mapping path="/member/removeForm"/>
        <beans:bean class="com.bs.lec21.member.MemberLoginInterceptor"/>
    </interceptor>
</interceptors>
cs

 

<interceptors>
    <interceptor>
        <mapping path="/member/**"/>
        <exclude-mapping path="/member/joinForm"/>
        <exclude-mapping path="/member/join"/>
        <exclude-mapping path="/member/loginForm"/>
        <exclude-mapping path="/member/login"/>
        <exclude-mapping path="/member/logout"/>
        <exclude-mapping path="/member/modify"/>
        <exclude-mapping path="/member/remove"/>
        <beans:bean class="com.bs.lec21.member.MemberLoginInterceptor"/>
    </interceptor>
</interceptors>

Colored by Color Scripter

cs

posted by DevMoomin
:
Spring/Study 2020. 4. 18. 20:54

(공감과 댓글 하나는 글쓴이에게 큰 힘이 됩니다.)

 

웹 서비스는 HTTP 프로토콜을 기반으로 하는데, HTTP 프로토콜은 클라이언트와 서버의 관계를 유지하지 않는 특징이 있다. 이러한 특징 때문에 서버의 부하를 줄일 수는 있지만, 매번 새로운 연결이 생성되므로 로그인 상태 유지 등의 기능을 구현하기가 어렵다. 따라서 세션(Session)과 쿠키(Cookie)를 이용하여 서버의 연결을 유지시키게 되는데, 세션은 서버에서 연결 정보를 관리하고, 쿠키는 클라이언트에서 연결 정보를 관리한다는 차이점이 있다.

 

세션(Session)

HttpServletRequest를 이용한 세션 사용

@RequestMapping(value = "/login", method = RequestMethod.POST)
public String memLogin(Member member, HttpServletRequest request) {        
    Member mem = service.memberSearch(member);
    
    HttpSession session = request.getSession();
    session.setAttribute("member", mem);
    
    return "/member/loginOk";
}
cs

HttpSession을 이용한 세션 사용

@RequestMapping(value = "/login", method = RequestMethod.POST)
public String memLogin(Member member, HttpSession session) {        
    Member mem = service.memberSearch(member);
        
    session.setAttribute("member", mem);
        
    return "/member/loginOk";
}
cs

invalidate() 메소드를 이용한 세션 삭제

@RequestMapping("/logout")
public String memLogout(Member member, HttpSession session) {
    session.invalidate();
        
    return "/member/logoutOk";
}
 
@RequestMapping(value = "/remove", method = RequestMethod.POST)
public String memRemove(Member member, HttpServletRequest request) {        
    service.memberRemove(member);
        
    HttpSession session = request.getSession();
    session.invalidate();
        
    return "/member/removeOk";
}
cs

 

쿠키(Cookie)

쿠키 생성

- 쿠키 생성 시 파라미터의 첫 번째는 쿠키의 이름, 두 번재는 쿠키의 값이 들어간다.

@RequestMapping("/main")
public String mallMain(Mall mall, HttpServletResponse response){
    Cookie genderCookie = new Cookie("gender", mall.getGender());
        
    if(mall.isCookieDel()) {
        genderCookie.setMaxAge(0);
        mall.setGender(null);
    } else {
        genderCookie.setMaxAge(60*60*24*30);
    }
 
    response.addCookie(genderCookie);
        
    return "/mall/main";
}
cs

쿠키 사용

- @CookieValue로 쿠키를 사용한다. value에 명시한 쿠키가 없을 경우 Exception이 발생하는데, required를 false로 설정해서 해당하는 쿠키가 없어도 Exception이 발생하지 않도록 할 수 있다. (requied의 Default는 true)

 

@RequestMapping("/index")

public String mallIndex(Mall mall, @CookieValue(value="gender", required=false) Cookie genderCookie, HttpServletRequest request) {

    if(genderCookie != null) mall.setGender(genderCookie.getValue());

        

    return "/mall/index";

}

 

Colored by Color Scripter

cs

posted by DevMoomin
:
Spring/Study 2020. 4. 17. 20:17

(공감과 댓글 하나는 글쓴이에게 큰 힘이 됩니다.)

 

@ModelAttribute

@ModelAttirbute를 이용하면 커멘드 객체의 이름을 변경할 수 있고, 이렇게 변경된 이름은 뷰에서 커멘드 객체를 참조할 때사용된다.

MemberController.java

@RequestMapping(value = "/memRemove", method = RequestMethod.POST)
public String memRemove(@ModelAttribute("mem") Member member) {    
    service.memberRemove(member);    
    return "memRemoveOk";
}
cs

memRemoveOk.jsp

ID : ${mem.memId}<br />
cs

 

커맨드 객체 프로퍼티 데이터 타입

memJoin.html

<form action="/lec19/member/memJoin" method="post">
    ID : <input type="text" name="memId" ><br />
    PW : <input type="password" name="memPw" ><br />
    MAIL : <input type="text" name="memMail" ><br />
    PHONE1 : <input type="text" name="memPhones[0].memPhone1" size="5"> -
             <input type="text" name="memPhones[0].memPhone2" size="5"> -
             <input type="text" name="memPhones[0].memPhone3" size="5"><br />
    PHONE2 : <input type="text" name="memPhones[1].memPhone1" size="5"> -
             <input type="text" name="memPhones[1].memPhone2" size="5"> -
             <input type="text" name="memPhones[1].memPhone3" size="5"><br />
    <input type="submit" value="Join" >
    <input type="reset" value="Cancel" >
</form>
cs

Member.java

public class Member {
    private String memId;
    private String memPw;
    private String memMail;
    private List<MemPhone> memPhones;
    
    public String getMemId() {
        return memId;
    }
    public void setMemId(String memId) {
        this.memId = memId;
    }
    public String getMemPw() {
        return memPw;
    }
    public void setMemPw(String memPw) {
        this.memPw = memPw;
    }
    public String getMemMail() {
        return memMail;
    }
    public void setMemMail(String memMail) {
        this.memMail = memMail;
    }
    public List<MemPhone> getMemPhones() {
        return memPhones;
    }
    public void setMemPhones(List<MemPhone> memPhones) {
        this.memPhones = memPhones;
    }
}
cs

 

Model & ModelAndView

Controller에서 View에 데이터를 전달하기 위해 사용되는 객체로 Model과 ModelAndView가 있다. Model은 뷰에 데이터만을 전달하기 위한 객체이고, ModelAndView는 데이터와 뷰의 이름을 함께 전달하는 객체이다.

@RequestMapping(value = "/memModify", method = RequestMethod.POST)
public String memModify(Model model, Member member) {    
    Member[] members = service.memberModify(member);
        
    model.addAttribute("memBef", members[0]);
    model.addAttribute("memAft", members[1]);
        
    return "memModifyOk";
}
cs

 

@RequestMapping(value = "/memModify", method = RequestMethod.POST)

public ModelAndView memModify(Member member) {        

    Member[] members = service.memberModify(member);

        

    ModelAndView mav = new ModelAndView();

    mav.addObject("memBef", members[0]);

    mav.addObject("memAft", members[1]);

        

    mav.setViewName("memModifyOk");

    

    return mav;

}

Colored by Color Scripter

cs

posted by DevMoomin
:
Spring/Study 2020. 4. 17. 19:54

(공감과 댓글 하나는 글쓴이에게 큰 힘이 됩니다.)

 

@RequestMapping을 이용한 URL 매핑

@RequestMapping 어노테이션은 http request로 들어오는 URL을 특정 Controller 클래스나 메소드로 연결시켜주는 역할을 한다.

@RequestMapping(value="/memJoin", method=RequestMethod.GET)과 같이 value와 method 속성을 사용할 수 있는데, method의 Default 값은 GET이므로 method를 명시하지 않으면 자동으로 GET 요청을 처리한다.  method 없이 value만 사용할 경우 이름을 생략하여 @RequestMapping("memJoin")과 같이 사용 가능하다.

메소드에 @RequestMapping 적용

public class MemberController {
    @Resource(name="memService")
    MemberService service;
    
    @RequestMapping(value="/member/memLogin", method=RequestMethod.POST)    
    public String memLogin(Model model, HttpServletRequest request) {
        String memId = request.getParameter("memId");
        String memPw = request.getParameter("memPw");
        
        model.addAttribute("memId", memId);
        model.addAttribute("memPw", memPw);        
        
        return "memLoginOk";
    }
}
cs

클래스에 @RequestMapping 적용

@RequestMapping("/member")
public class MemberController {
    @Resource(name="memService")
    MemberService service;
    
    @RequestMapping(value="/memLogin", method=RequestMethod.POST)    
    public String memLogin(Model model, HttpServletRequest request) {
        String memId = request.getParameter("memId");
        String memPw = request.getParameter("memPw");
        
        model.addAttribute("memId", memId);
        model.addAttribute("memPw", memPw);        
        
        return "memLoginOk";
    }
}
cs

 

요청 파라미터

HttpServletRequest 객체를 이용한 HTTP 전송 정보 얻기

login.html

ID : <input type="text" name="memId" ><br />
PW : <input type="password" name="memPw" ><br />
cs

MemberController.java

@RequestMapping("/member")
public class MemberController {
    @Resource(name="memService")
    MemberService service;
 
    @RequestMapping(value="/memLogin", method=RequestMethod.POST)    
    public String memLogin(Model model, HttpServletRequest request) {
        String memId = request.getParameter("memId");
        String memPw = request.getParameter("memPw");
        
        model.addAttribute("memId", memId);
        model.addAttribute("memPw", memPw);        
        
        return "memLoginOk";
    }
}
cs

 

@RequestParam 어노테이션을 이용한 HTTP 전송 정보 얻기

login.html

ID : <input type="text" name="memId" ><br />
PW : <input type="password" name="memPw" ><br />
cs

MemberController.java

@RequestMapping(value="/memLogin", method=RequestMethod.POST)
public String memLogin(Model model, @RequestParam("memId"String memId, @RequestParam("memPw"String memPw) {    
    Member member = service.memberSearch(memId, memPw);
        
    model.addAttribute("memId", member.getMemId());
    model.addAttribute("memPw", member.getMemPw());
                
    return "memLoginOk";
}
cs

 

커멘드 객체를 이용한 HTTP 전송 정보 얻기

memJoin.html

<form action="/lec18/member/memJoin" method="post">
    ID : <input type="text" name="memId" ><br />
    PW : <input type="password" name="memPw" ><br />
    MAIL : <input type="text" name="memMail" ><br />
    PHONE : <input type="text" name="memPhone.memPhone1" size="5"> -
            <input type="text" name="memPhone.memPhone2" size="5"> -
            <input type="text" name="memPhone.memPhone3" size="5"><br />
    AGE : <input type="text" name="memAge" size="4"><br />
            <input type="submit" value="Join" >
            <input type="reset" value="Cancel" >
</form>
cs

Member.java

public class Member {
    private String memId;
    private String memPw;
    private String memMail;
    private MemPhone memPhone;
    
    public String getMemId() {
        return memId;
    }
    public void setMemId(String memId) {
        this.memId = memId;
    }
    public String getMemPw() {
        return memPw;
    }
    public void setMemPw(String memPw) {
        this.memPw = memPw;
    }
    public String getMemMail() {
        return memMail;
    }
    public void setMemMail(String memMail) {
        this.memMail = memMail;
    }
    public MemPhone getMemPhone() {
        return memPhone;
    }
    public void setMemPhone(MemPhone memPhone) {
        this.memPhone = memPhone;
    }
}
cs

MemberController.java

@RequestMapping(value="/memJoin", method=RequestMethod.POST)
public String memJoin(Member member) {    
    service.memberRegister(member);        
    return "memJoinOk";
}
cs

memberJoinOk.jsp

 

ID : ${member.memId}<br />

PW : ${member.memPw}<br />

Mail : ${member.memMail} <br />

Phone : ${member.memPhone.memPhone1} - ${member.memPhone.memPhone2} - ${member.memPhone.memPhone3}<br />

 

cs

posted by DevMoomin
:
Spring/Study 2020. 4. 16. 22:13

(공감과 댓글 하나는 글쓴이에게 큰 힘이 됩니다.)

 

Service 객체 구현

@Service, @Component @Resource, @Repository 어노테이션을 이용하여 Service 객체 생성 및 자동주입이 가능하다. 어노테이션 뒤에 괄호로 이름을 넣어주기도 하는데, 이름을 빼고도 사용할 수 있다.

MemberController.java

@Controller
public class MemberController {
    @Resource(name="memService")
    MemberService service;
}
cs

MemberService.java

//@Service
//@Service("memService")
//@Component
//@Component("memService")
//@Repository
@Repository("memService")
public class MemberService implements IMemberService {
    @Autowired
    MemberDao dao;
}
cs

 

DAO 객체 구현

Service 객체와 마찬가지로 어노테이션을 이용하여 DAO 객체 생성 및 자동주입이 가능하다.

MemberController.java

@Controller
public class MemberController {
   @Resource
    MemberService service;
}
cs

MemberDao.java

@Repository
public class MemberDao implements IMemberDao {
    private HashMap<String, Member> dbMap;
    
    public MemberDao() {
        dbMap = new HashMap<String, Member>();
    }
}

Colored by Color Scripter

cs

posted by DevMoomin
:
Spring/Study 2020. 4. 16. 22:01

(공감과 댓글 하나는 글쓴이에게 큰 힘이 됩니다.)

 

스프링(Spring)에서 한글의 깨짐을 방지하기 위해 UTF-8 형식으로 인코딩을 해주어야 한다. 웹 설정파일에서 <filter> 태그를 통해 인코딩이 가능하다.

 

web.xml

<filter>
    <filter-name>encodingFilter</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>
    <init-param>
        <param-name>forceEncoding</param-name>
        <param-value>true</param-value>
    </init-param>
</filter>
        
<filter-mapping>
    <filter-name>encodingFilter</filter-name>
    <url-pattern>/*</url-pattern>
</filter-mapping>
cs

 

실행 결과

posted by DevMoomin
: