728x90

스프링에서 DB에 접근하는 방법에 대해 공부해보자.

 

DB는 H2를 사용하며 다운로드를 받고 실행 한 후 테이블을 생성한다.

drop table if exists member CASCADE;
create table student
(
        id   bigint generated by default as identity,
        name varchar(255),
        primary key (id)
);

이렇게 student 테이블을 생성을 한다.

 

이제 스프링으로 돌아가서 jdbc에 대한 설정을 해준다.

build.gradle에 dependencies에서

implementation 'org.springframework.boot:spring-boot-start-jdbc'
runtimeOnly 'com.h2database:h2'

를 추가해 jdbc, h2 데이터베이스 관련 라이브러리를 추가한다.

 

동기화를 해주고

resources/application.properties에서

spring.datasource.url=jdbc:h2:tcp://localhost/~/test
spring.datasource.driver-class-name=org.h2.Driver
spring.datasoure.username=sa

를 추가해준다.

동기화가 완료되면 빨간 줄이 드지 않을거다.

 

Jdbc 리포지토리 구현

Jdbc로 리포지토리를 구현해보려 했으나...

너무 어렵고 요즘은 쓰지 않기 때문에 여기에 코드를 적지는 않고 실행과 테스트만 해보도록 하겠다.

 

Service에서 사용하던 리포지토리를 memory에서 jdbc로 옮긴다는 것만 알고 있으면...

스프링을 껐다가 켜도 DB가 살아있다면 데이터가 유지되는 것을 볼 수 있다.

 

바로 테스트를 작성해보자.

package spring_practice.spring_practice.service;

import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.transaction.annotation.Transactional;
import spring_practice.spring_practice.domain.Member;
import spring_practice.spring_practice.repository.MemberRepository;

@SpringBootTest
@Transactional
class MemberServiceDBTest {

    @Autowired
    MemberService memberService;
    @Autowired
    MemberRepository memberRepository;

    @Test
    public void join() throws Exception{
        //given
        Member member = new Member();
        member.setName("seungkyu");

        //when
        Long saveId = memberService.join(member);

        //then
        Member findMember = memberRepository.findById(saveId).get();
        Assertions.assertEquals(member.getName(), findMember.getName());
    }
}

DB를 사용할 때는 AfterEach를 사용하는 것이 아니라 @Transactional을 사용하면 테스트 후에 DB를 테스트 전으로 돌려준다.

 

AOP

모든 메서드에서 핵심은 아니지만 공통적으로 들어가는 사항이 있다. ex) 시간 측정

 

이 로직을 메서드 안에 넣어버리면 핵심 비즈니스의 로직과 섞여서 유지보수가 어려워 공통 관심 사항과 핵심 관심 사항으로 분리한다.

package spring_practice.spring_practice.aop;

import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.springframework.stereotype.Component;

@Aspect
@Component
public class TimeTraceAop {

    @Around("execution(* spring_practice.spring_practice..*(..))")
    public Object execute(ProceedingJoinPoint joinPoint) throws Throwable{
        long start = System.currentTimeMillis();
        System.out.println("START: " + joinPoint.toString());
        try{
            return joinPoint.proceed();
        }finally{
            long finish = System.currentTimeMillis();
            long timeMs = finish - start;
            System.out.println("END: " + joinPoint.toString() + " " + timeMs + "ms");
        }
    }
}

'Spring > 스프링' 카테고리의 다른 글

스프링 7일차  (0) 2023.02.07
스프링 6일차  (0) 2023.02.06
스프링 5일차  (0) 2023.02.04
스프링 3일차  (0) 2023.02.01
스프링 2일차  (0) 2023.01.18
728x90

의존관계

 

스프링 빈을 등록하고 의존관계를 설정하는 방법을 알아보자.

 

@Componenet를 사용하여 컴포넌트 스캔으로 자동 의존관계를 설정하는 방법과

자바 코드로 직접 스프링 빈을 등록하는 방법이 있다.

 

이제 컨트롤러를 사용하여 페이지를 보여주어야 하고 그 컨트롤러는 학생 서비스 객체를 이용해야 한다.

이 상황에서 컨트롤러에 서비스를 주입을 해주어야 하는데 그 과정을 살펴보자.

 

우선 컨트롤러를 만들어보자

이렇게 StuController가 생성이 될 때 @Autowired를 이용해 의존관계를 주입해주었다.

생성자에 @Autowired가 있으면 연관된 객체를 spring이 찾아서 넣어준다.

 

하지만 저렇게 빨간줄이 뜨는 것을 볼 수 있는데, spring이 실행될 때 memberService가 없기 때문이다.

따라서 이럴 때에는 의존되는 memberService도 스프링 빈으로 등록을 해주어야 한다.

(@Controller가 있으면 spring에 자동으로 등록이 된다.)

 

서비스에도 이렇게 @Service annotation을 달아준다.

여기에도 의존관계를 주입해주어야 하는 부분에서 등록이 되어 있지 않기 때문에 빨간 줄이 뜨는 것을 볼 수 있다.

여기도 다시 리포지토리를 찾아서 @Repository annotation을 달아주자.

 

@Controller, @Service, @Repository에 해당하는 annotation들은 @Component 를 포함하기 때문에 등록이 된다.

리포지토리까지 annotation을 달아주면

 

memberController -> memberService -> memberRepository 로 스프링에 의존관계가 설정이 된다.

 

직접 자바코드를 사용하여 등록을 하려면

 

@Bean annotation을 사용하여 Configuration을 해주는 객체를 생성해주면 된다.

 

웹 MVC 개발

 

이제 웹 페이지를 만들어보자

우선 관련 controller를 만든다

 

기본 페이지 관련 Controller와 html

package spring_practice.spring_practice.controller;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;

@Controller
public class HomeController {

    @GetMapping("/")
    public String home(){
        return "home";
    }
}

localhost에 들어가면 바로 home.html로 보내준다.

 

home.html이다.

<html xmlns:th="http://thymeleaf.org">
<head>
  <title>학생 관리</title>
</head>
<body>
<div class="container">
  <div>
    <h1>학생 관리 프로그램</h1>
    <p>회원 기능</p>
    <p>
      <a href="/student/new">신입생 등록</a>
      <a href="/student">학생 리스트</a>
    </p>
  </div>
</div>
</body>
</html>

 

신입생 등록 컨트롤러이다.

package spring_practice.spring_practice.controller;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import spring_practice.spring_practice.service.MemberService;

@Controller
public class StuController {

    private final MemberService memberService;

    @Autowired
    public StuController(MemberService memberService){
        this.memberService = memberService;
    }

    @GetMapping("/student/new")
    public String createForm(){
        return "student/createStuForm";
    }
}

 

만들었던 Controller에 @GetMapping annotation으로 해당 주소에 접근하면 student/createStuForm.html을 열어주는 메서드를 생성하고

<!DOCTYPE HTML>
<body>
<div class="container">
  <form action="/student/new" method="post">
    <div class = "form-group">
      <label form="name">이름</label>
      <input type="text" id="name" name="name" placeholder="이름을 입력하세요">
    </div>
    <button type="submit">신입생 등록</button>
  </form>
</div>
</body>

 

그리고 Controller와 같은 패키지에

package spring_practice.spring_practice.controller;

public class StuForm {
    private String name;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
}

폼 관련 객체를 생성을 해준다.

 

이제 이 폼을 사용하여 등록하는 기능을 구현하자, @PostMapping을 사용하여 해당 페이지에서 작동하게 만들고

return redirect:/으로 home으로 보내준다.

package spring_practice.spring_practice.controller;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import spring_practice.spring_practice.domain.Member;
import spring_practice.spring_practice.service.MemberService;

@Controller
public class StuController {

    private final MemberService memberService;

    @Autowired
    public StuController(MemberService memberService){
        this.memberService = memberService;
    }

    @GetMapping("/student/new")
    public String createForm(){
        return "student/createStuForm";
    }

    @PostMapping("/student/new")
    public String create(StuForm form){
        Member member = new Member();
        member.setName(form.getName());
        memberService.join(member);

        return "redirect:/";
    }
}

이렇게만 하고 실행을 해보면

이런 home 페이지와

이런 신입생 등록페이지가 만들어지고 신입생 등록 버튼을 누르면 home 페이지로 이동하게 된다.

 

이제 조회기능을 추가하자, 컨트롤러에

    @GetMapping("student")
    public String list(Model model){
        List<Member> students = memberService.findMembers();
        model.addAttribute("students", students);
        return "student/studentList";
    }

이런 메서드를 추가하여 memberService에서 모든 학생 정보를 가져온 후 model의 속성에 추가해서 student/studentList.html로 넘겨준 후

 

<!DOCTYPE HTML>
<html xmlns:th="http://www.thymeleaf.org">
<body>
<div class="container">
  <div>
    <table>
      <thead>
      <tr>
        <th>#</th>
        <th>name</th>
      </tr>
      </thead>
      <tbody>
      <tr th:each="student : ${students}">
        <td th:text="${student.getStudentId()}"></td>
        <td th:text="${student.getName()}"></td>
      </tr>
      </tbody>
    </table>
  </div>
</div>
</body>
</html>

이렇게 each로 돌면서 모든 학생들을 보여지게 한다.

이러면

이렇게 페이지가 잘 보여지는 것을 확인 할 수 있다.

'Spring > 스프링' 카테고리의 다른 글

스프링 7일차  (0) 2023.02.07
스프링 6일차  (0) 2023.02.06
스프링 5일차  (0) 2023.02.04
스프링 4일차  (0) 2023.02.03
스프링 2일차  (0) 2023.01.18
728x90

아직 배운 것은 많이 없지만 그래도 예제(학생 관리 예제)를 하나 작성 해보자

 

소프트웨어설계에서 공부한 대로

 

비즈니스 요구사항 정리

학생 도메인과 레포지토리 만들기

학생 레포지토리 테스트 케이스 작성

학생 서비스 개발

 

의 순서로 진행이 될 예정이다.

 

  • 비즈니스 요구사항 정리

우선 비즈니스 요구사항을 정리하자면

 

학교라고 설정을 하고

 

데이터는 학번, 이름

기능은 학생 등록, 조회

이 정도만 구현을 해보도록 하자

 

일반적으로 구조는

컨트롤러는 저번에 만들어 보았던 대로 웹 MVC에서 C의 컨트롤러이다.

서비스는 비즈니스에 관련된 로직을 구현한다.

리포지토리는 데이터베이스에 접근하며, 객체를 DB에 저장하고 관리한다.

 

아직 리포지토리에서 어떤 저장소를 사용할지 결정하지 않아서 interface로 클래스를 변경할 수 있도록 설계한다.

  • 학생 도메인과 리포지토리 만들기

당연히 프로젝트를 생성하고

클래스를 작성할 패키지를 생성한 후 작성을 해준다.

package spring_practice.spring_practice.domain;

public class Member {
    
    private Long studentId; //학번
    private String name; //이름

    public Long getStudentId() {
        return studentId;
    }

    public void setStudentId(Long studentId) {
        this.studentId = studentId;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
}

이렇게 학번과 이름을 가지고 있는 클래스를 만들고, command + n을 이용하여 getter와 setter를 작성해 준다.

 

이번엔 리포지토리를 만들자, 아직 선정되지 않았으니 인터페이스를 만들고 구현을 하도록 해야 한다.

package repository;

import domain.Member;

import java.util.List;
import java.util.Optional;

public interface MemberRepository {
    Member save(Member member); //학생을 추가하는 메서드
    Optional<Member> findById(Long id); //학번을 이용하여 학생을 찾는 메서드
    Optional<Member> findByName(String name); //이름을 이용하여 학생을 찾는 메서드
    List<Member> findAll(); //지금까지 저장된 학생을 LIST 로 받아오는 메서드
}

 

일단 이 인터페이스를 구현할 class를 작성한다.

package spring_practice.spring_practice.repository;

import spring_practice.spring_practice.domain.Member;

import java.util.*;

public class MemoryMemberRepository implements MemberRepository{

    private static Map<Long, Member> store = new HashMap<>(); //학생들의 정보를 저장할 Map
    private static Long sequence = 0L;

    @Override
    public Member save(Member member) {
        member.setStudentId(++sequence);
        store.put(member.getStudentId(), member);
        return member;
    }

    @Override
    public Optional<Member> findById(Long id) {
        return Optional.ofNullable(store.get(id));
    }

    @Override
    public Optional<Member> findByName(String name) {
        return store.values().stream()
                .filter(member -> member.getName().equals(name))
                .findAny();
    }

    @Override
    public List<Member> findAll() {
        return new ArrayList<>(store.values());
    }

    public void clearStore(){
        store.clear();
    }
}

학생들의 데이터는 일단 Map을 이용하여 저장을 한다.

 

  • 학생 리포지토리 테스트 케이스 작성

일단 여기까지 하고 바로바로 테스트를 진행해 보자.

test 케이스는 test 폴더 밑에 작성을 한다.

 

그리고 보통 테스트 케이스의 패키지는 기존 패키지와 똑같이 작성을 한다.

그리고 테스트할 class의 파일명에 Test를 붙여서 테스트 케이스의 이름을 작성한다.

 

간단하게 command + shift + T로 만들 수도 있다.

여기 안에 테스트 코드들을 작성해야 한다.

각 메서드들을 보면 @Test annotation이 달려있는 것을 볼 수 있다.

 

class 내에서 윗부분에

    MemoryMemberRepository repository = new MemoryMemberRepository();
    
    @AfterEach
    public void afterEach(){
        repository.clearStore();
    }

이 코드를 추가하자

repository는 테스트하면서 사용할 리퍼지토리이고 afterEach메서드는 각각의 메서드를 테스트할 때마다 리퍼지토리를 비워즈는 메서드이다.

@AfterEach annotation을 달아서 각 테스트 후에 실행이 되도록 해준다.

 

차례로 save 메서드부터 테스트해 보자

save 메서드는 새로운 학생을 추가하는 메서드이다.

    @Test
    void save() {
        //given
        Member member = new Member();
        member.setName("seungkyu");
        
        //when
        repository.save(member);
        
        //then
        Member result = repository.findById(member.getStudentId()).get();
        Assertions.assertEquals(member, result);
    }

테스트 케이스는 given, when, then 상황 3가지로 나누어 작성을 하고

seungkyu라는 이름을 가진 멤버를 추가하고 repository에서 학번으로 해당 멤버를 찾은 후 Assert로 둘이 일치하는지 확인하는 테스트이다.

 

이렇게 작성을 한 후 run을 하면

이렇게 문제없이 초록색으로 보이게 된다.

 

이번엔 이름을 이용해서 가져오는 findByName을 테스트하자

    @Test
    void findByName() {
        //given
        Member member1 = new Member();
        member1.setName("seungkyu1");
        repository.save(member1);

        Member member2 = new Member();
        member2.setName("seungkyu2");
        repository.save(member2);

        //when
        Member result = repository.findByName("seungkyu1").get();

        //then
        Assertions.assertEquals(member1, result);
        Assertions.assertNotEquals(member2, result);
    }

이름을 이용해 가져와보고 member1과 result가 같은지, member2와 result가 같지 않은지를 확인해 본다.

테스트를 수행하면 정상적으로 초록불이 나올 것이다.

 

마지막으로 전체를 가져오는 findAll이다.

@Test
    void findAll() {
        //given
        Member member1 = new Member();
        member1.setName("seungkyu1");
        repository.save(member1);
        
        Member member2 = new Member();
        member2.setName("seungkyu2");
        repository.save(member2);
        
        //when
        List<Member> result = repository.findAll();
        
        //then
        Assertions.assertEquals(2, result.size());
    }

이렇게 작성을 하면 2개의 객체를 추가했으니 사이즈는 2가 되어야 한다.

AfterEach를 수행하고 테스트를 수행하기 때문에 정상적으로 초록불이 들어와야 한다.

 

  • 학생 서비스 개발

비즈니스에 가까운 서비스를 개발해 보자.

Service 패키지를 따로 만든 후

 

우선 memberRepository를 생성자를 이용해 주입할 수 있도록 만들고

package spring_practice.spring_practice.service;

import spring_practice.spring_practice.repository.MemberRepository;

public class MemberService {

    private final MemberRepository memberRepository;

    public MemberService(MemberRepository memberRepository){
        this.memberRepository = memberRepository;
    }   
}

이렇게 DI가 가능하도록 설계를 해야 나중에 리퍼지토리를 변경할 때 적은 코드를 수정할 수 있게 된다.

 

package spring_practice.spring_practice.service;

import spring_practice.spring_practice.domain.Member;
import spring_practice.spring_practice.repository.MemberRepository;

import java.util.List;
import java.util.Optional;

public class MemberService {

    private final MemberRepository memberRepository;

    public MemberService(MemberRepository memberRepository){
        this.memberRepository = memberRepository;
    }

    private void validateDuplicateMember(Member member){ // 같은 이름의 학생이 있는지 찾아주는 메서드
        memberRepository.findByName(member.getName())
                .ifPresent(m -> {
                    throw new IllegalStateException("이미 등록된 학생입니다.");
                });
    }

    public Long join(Member member){
        validateDuplicateMember(member);
        memberRepository.save(member); // 이미 등록된 학생이 아니면 저장
        return member.getStudentId();
    }

    public List<Member> findMembers(){
        return memberRepository.findAll();
    }

    public Optional<Member> findStudent(Long studentId){
        return memberRepository.findById(studentId);
    }
}

원래는 같은 이름을 가진 학생들이 있겠지만 학습을 위해 같은 이름의 학생을 등록할 수 없도록 만들어보자.

 

이해하기 어렵지 않을 것이고 바로 테스트 케이스를 만들어보자.

당연히 command + shift + T로 만들것이며 AfterEach에 이어서 테스트가 수행되기 전에 실행되는 BeforeEach를 사용할 것이다.

 

이 서비스는 생성자를 통해 외부에서 리퍼지토리를 주입해주어야 했다.

그렇기에 BeforeEach를 통해 각 테스트 실행 전마다 주입해 줄 예정이다.

package spring_practice.spring_practice.service;

import org.junit.jupiter.api.AfterEach;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import spring_practice.spring_practice.repository.MemoryMemberRepository;

import static org.junit.jupiter.api.Assertions.*;

class MemberServiceTest {

    MemberService memberService;
    MemoryMemberRepository memberRepository;

    @BeforeEach
    public void beforeEach(){
        memberRepository = new MemoryMemberRepository();
        memberService = new MemberService(memberRepository);
    }
    
    @Test
    void join() {
    }

    @Test
    void findMembers() {
    }

    @Test
    void findStudent() {
    }
}

 

나머지 코드들을 작성해보자.

package spring_practice.spring_practice.service;

import org.junit.jupiter.api.AfterEach;
import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import spring_practice.spring_practice.domain.Member;
import spring_practice.spring_practice.repository.MemoryMemberRepository;

import static org.junit.jupiter.api.Assertions.*;

class MemberServiceTest {

    MemberService memberService;
    MemoryMemberRepository memberRepository;

    @BeforeEach
    public void beforeEach(){
        memberRepository = new MemoryMemberRepository();
        memberService = new MemberService(memberRepository);
    }

    @AfterEach
    public void afterEach(){
        memberRepository.clearStore();
    }

    @Test
    void join() throws Exception{
        //given
        Member member = new Member();
        member.setName("seungkyu");

        //when
        Long stuId = memberService.join(member);

        //then
        Member findMember = memberRepository.findById(stuId).get();
        Assertions.assertEquals(member, findMember);
    }

    void dupliExc() throws Exception{
        //given
        Member member1 = new Member();
        member1.setName("seungkyu");

        Member member2 = new Member();
        member2.setName("seungkyu");

        //when
        memberService.join(member1);
        IllegalStateException e = assertThrows(IllegalStateException.class, () -> memberService.join(member2));

        Assertions.assertEquals(e.getMessage(), "이미 등록된 학생입니다.");
    }
}

저렇게 seungkyu라는 이름의 학생이 두명이니 중복 예외가 발생해야 할 것이고 그것까지 테스트하는 코드이다.

'Spring > 스프링' 카테고리의 다른 글

스프링 7일차  (0) 2023.02.07
스프링 6일차  (0) 2023.02.06
스프링 5일차  (0) 2023.02.04
스프링 4일차  (0) 2023.02.03
스프링 3일차  (0) 2023.02.01
728x90

오늘은 클라이언트와 서버의 연결을 유지시켜주는 방법인 Cookie에 대해서 알아본다.

 

  • Cookie란?

서버와 클라이언트의 연결에 대한 흔적을 남기는 것을 Cookie라고 한다.

다음에 연결할 일이 생긴다면 이 Cookie를 참고하게 된다.

  • Cookie 구현

Cookie[] cookies = request.getCookies();
Cookie cookie = null;

for(Cookie c : cookies){
	System.out.println("c.getName(): " + c.getName() + ", c.getValue() :" + c.getValue());
    
    if(c.getName().equals("memberId")){
    	cookie = c;
	}
}

if(cookie == null){
	System.out.println("cookie is null");
    cookie = new Cookie("memberId", mId);
}

response.addCookie(cookie);
cookie.setMaxAge(60 * 60);

response.sendRedirect("loginOk.jsp");

 

이렇게 Cookie를 찾아보고 없으면 새로운 Cookie를 만드는 방식으로 구현을 한다.

 

이제 실습을 해보도록 하자, 바로 프로젝트를 생성을 해주면 된다.

우선 jsp로 페이지를 먼저 만들도록 하자.

loginCon으로 처리를 하도록 페이지를 작성했다.

 

그럼 해당 데이터를 받는 loginCon Servlet을 작성해보자

해당 데이터를 받고 클라이언트에서 모든 Cookie를 검사하고 만약 memberId에 해당하는 쿠키가 없다면 쿠키를 생성해준다.

쿠키의 유지 시간을 60 * 60초로 갱신을 해주고

loginOk.jsp로 보낸다.

loginOk.jsp이다

Cookie 배열에 있는 모든 쿠키를 출력해준다.

 

이제 다시 login.jsp로 돌아가야 한다.

 

만약 쿠키가 남아있다면 login을 하지 않아도 접속이 될 수 있도록 만들어야 할 것이다.

그렇기 때문에

윗 부분에 서블렛 태그로 만약 memberId에 해당하는 Cookie가 있다면 loginOk.jsp를 실행해주는 코드를 추가해준다.

 

그렇다면 만약 쿠키가 남아있다면

이런 화면이 출력되게 된다.

 

이렇게 웹에서 쿠키를 남기는 방법에 대해 알아보았다.

'Spring > JSP, Servlet' 카테고리의 다른 글

JSP & Servlet 12일차  (0) 2023.02.05
JSP & Servlet 11일차  (0) 2023.02.05
JSP & Servlet 9일차  (0) 2023.01.15
JSP & Servlet 8일차  (0) 2023.01.04
JSP & Servlet 7일차  (0) 2023.01.04
728x90

Servlet에서 데이터를 공유하는 방법에 대해 공부하자

 

  • Servlet parameter

이렇게 늘 그렇게 했듯이 

xml에 작성된 데이터를 가져오는 방법이다.

 

당연히 한 번 해보도록 하자

프로젝트를 생성한 후

web.xml에 servlet을 mapping 해주고

이렇게 init-parameter들도 넣어준다.

 

이러면 이제 Servlet으로 가서

이렇게 초기값들도 getServletConfig를 이용해 가져와본다.

 

실행을 해보면 당연히

이렇게 초기값들이 잘 출력이 되게 된다.

 

  • context parameter

이것도 jsp 때와 비슷하다.

전체적으로 공유될 수 있는 데이터이며

 

바로 사용을 해보자면

이렇게 xml에 context-param을 적어주고

이렇게 getServletContext로 가져와보면

잘 가져와지는 것을 확인 할 수 있다.

 

  • context attribute

JSP 때와 마찬가지로 데이터를 set하고 get하는 방법을 알아보자

이렇게 setAttribute를 작성해두고

이것을 가져와보기 위해 다른 Servlet을 작성해본다.

다른 Servlet에서 getAttribute를 이용해 데이터를 가져와보고

실행을 해보면

처음에는 이렇게 데이터들을 가져올 수 없어 null이 뜨게 된다.

setAttribute가 작성된 페이지를 켜본 후

새로고침을 해보면 이렇게 원하는 결과가 출력되는 것을 볼 수 있다.

'Spring > JSP, Servlet' 카테고리의 다른 글

JSP & Servlet 12일차  (0) 2023.02.05
JSP & Servlet 11일차  (0) 2023.02.05
JSP & Servlet 10일차  (0) 2023.01.16
JSP & Servlet 8일차  (0) 2023.01.04
JSP & Servlet 7일차  (0) 2023.01.04
728x90

request, response 외에 JSP에서 기본적으로 제공하는 객체에 대해 알아보자

 

  • config 객체

Web.xml의 데이터를 JSP에서 데이터를 공유하는 방식이다.

init-param으로 name과 value 쌍을 이루어 값을 초기화 해두고 작업을 하는 JSP에서 얻어 올 수 있다.

Config 객체로 부터 getInitParameter를 이용하여 초기화 된 값을 가져오는 방식이다.

 

한 번 해보도록 할 텐데 JSP 초기 설정하는 방법에서 자꾸 실수해서 오랜만에 여기다가 다시 기록하려 한다.

이렇게 jakarta EE로 server는 tomcat을 설정을 해주고

다음 페이지에서는 Servlet을 설정을 해준 뒤 만들어준다.

 

만든 후 Project Structure에서

web.xml을 추가해준다.

src -> main -> webapp에 jsp를 만들 수 있게 된다.

그럼 이대로 만들어보자

 

우선 web.xml에서

이렇게 mapping을 해준 다음

이렇게 init-param들을 추가해준다.

그 다음에는 jsp파일을 만든 후 초기화된 값들을 가져와보자

이렇게 출력을 위해 <p>태그까지 달고

실행 한 후 접속해보면

이렇게 xml에 설정해 둔 초기값들이 출력되는 것을 볼 수 있다.

  • application 객체

application 객체는 해당 프로젝트 전체에 영향을 미친다.

 

여기에 context param을 이용하면 모든 Servlet에서 모두 공유될 수 있는 데이터를 만들 수 있다.

 

우리가 사용했던 web.xml에 context-param을 추가한다.

application에서 전체적으로 공유하고 싶어하는 데이터를 이렇게 web.xml에 context-param으로 정의를 하고

JSP 파일에도 application.getInitParam을 이용해 데이터를 가져온다.

그러면 공유 객체도 이렇게 잘 가져오는 것이 보여진다.

application 객체는 프로젝트 전체에 영향을 미치기 때문에 속성을 저장하고 다른 곳에서 그렇게 만들어진 속성을 가져갈 수 있다.

이렇게 application.setAttribute를 이용해서 값을 설정해주고

application.getAttribute를 이용해서 값을 가져오는 방식이다.

이렇게 추가된 속성을 가져올 수 있다.

 

'Spring > JSP, Servlet' 카테고리의 다른 글

JSP & Servlet 12일차  (0) 2023.02.05
JSP & Servlet 11일차  (0) 2023.02.05
JSP & Servlet 10일차  (0) 2023.01.16
JSP & Servlet 9일차  (0) 2023.01.15
JSP & Servlet 7일차  (0) 2023.01.04
728x90

사용자의 요청 (Request)과 web-server의 응답 (Response)을 담당하는 객체에 대해서 학습합니다.

 

  • request 객체

바로 해보도록 하자

일단 데이터를 받기 위해 html 파일을 만든다.

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>

    <form action="mSignUp.jsp" method="get">
        name: <input type="text" name="m_name"><br>
        password: <input type="password" name="m_pass"><br>
        hobby:  sport <input type="checkbox" name="m_hobby" value="sport">,
                cooking <input type="checkbox" name="m_hobby" value="cooking">,
                travel <input type="checkbox" name="m_hobby" value="travel"><br>
        <input type="submit" value="sign up">
    </form>

</body>
</html>

당연히 이 안의 내용은 설명하지 않도록 하겠다.

당연히 이런 홈페이지가 출력이 된다.

우리는 여기서 jsp를 이용하여 데이터를 받아야 한다.

action="mSignUp.jsp" method="get"는

mSignUp.jsp를 사용하고 get 방식으로 데이터를 넘긴다는 것이다.

 

이 데이터를 받는 jsp 파일은 

이렇게 만들어진다.

 

태그들을 이용하여 데이터들을 받는데 대부분의 내용은 6일차의 내용과 비슷하고, 변수에 데이터를 입력받는 방식만 살펴본다면

request.getParameter(String s); 를 이용하여 값을 입력받는 것을 볼 수 있는데

Servlet과 똑같이 request 객체에서 뽑아 사용하면 된다.

 

실행을 시키고 데이터를

이렇게 입력해보면

이렇게 잘 출력이 되는 것을 볼 수 있다.

역시 Get방식이라 주소창의 주소가 긴 것을 볼 수 있다.

  • response 객체

위와는 반대로 응답하는 방법을 살펴보자

이런 jsp 파일을 만들고 

response.sendRedirect를 이용하여 secondPage.jsp를 연결해주었다.

sendRedirect는 지정한 페이지로 이동하는 방식이다.

secondPage.jsp의 내용은 이와같다.

이렇게 실행을 해보면

이렇게 First Page!!가 뜨지 않고 바로 Second Page!!가 뜨는 것을 볼 수 있다.

바로 secondPage.jsp로 넘어가기 때문이다.

JSP 응답에서도 이렇게 response 객체를 활용하면 된다.

 

JSP의 request와 response를 공부하면서 Servlet의 request와 response도 비교해보면 좋을 것 같다.

'Spring > JSP, Servlet' 카테고리의 다른 글

JSP & Servlet 12일차  (0) 2023.02.05
JSP & Servlet 11일차  (0) 2023.02.05
JSP & Servlet 10일차  (0) 2023.01.16
JSP & Servlet 9일차  (0) 2023.01.15
JSP & Servlet 8일차  (0) 2023.01.04

+ Recent posts