모각소2(스프링 빈, 회원 등록 기능)

LEEHYUNJE·2024년 1월 14일
0
post-thumbnail

오늘 모임에서 나는 김영한 강사님의 "스프링 입문"강의에서 스프링 빈에 대해 공부했다.

스프링 빈과 의존관계

  • 화면을 붙이고 싶은데 그럼 컨트롤러랑 뷰가 필요하다.
  • 컨트롤러가 멤버 서비스에 의존하면서 정보를 저장하고 해야함
  • 이를 spring 으로 함

@Controller가 입력되면 스프링 컨테이너에 객체가 생성된다.

스프링 빈을 등록하는 두가지 방법

1. 컴포넌트 스캔과 자동의존관계 설정 방법

  • @service 를 사용하면 @component 라고 붙어있음
    나머지 리포지토리 등등 나머지도 다 @component가 이어져있음
    전부 스프링 빈으로 등록시키기 위해 하는 짓이다. -> 스프링빈에 최대한 등록시켜놓는 것이 이득이다. -> 이유는 나중에

  • 컴포넌트 등록은 @srpingbootApplication이 존재하는 패키지에 하위만 컴포넌트 스캔한다.

2. 자바 코드로 스프링 빈을 등록하는 방법

  • 에노테이션을 이용하지 않고 스프링 빈으로 넣어주는 방법

  • 지금은 xml로 사용하지 않으므로 생략
    *DI에는

  • 생성자 주입 : 생성잘를 통해서 멤버 변수를 넣어주는 방법

  • 세터 주입 : 이런게 있다 정도로만.

요즘 권장하는 스타일은 생성자를 통해서 주입하는 방법이다.

  • 실무에서는 컨트롤러, 서비스,~ 컴포넌트 스캔을 사용한다.

  • 정형화 되지 않거나, 상황에 따라 구현 클래스를 변경해햐 하면 설정을 통해 스프링빈으로 등록한다(중요)

  • 메모리 구현체를 바꿀때 아예 다른 코드를 건드리지 않기 위해 빈(@Bean)으로 등록을 시킨다.

  • 스프링 컨테이너에 올라가는 것들만 오토 와이어드가 작동을 한다.
    이후 스프링 핵심 원리 강의에서 자세하게 설명한다.

회원 관리 예제 - 웹 MVC 개발

Tomcat 서버의 우선 순위

  • 웹주소/(키워드)를 client에서 입력했을 때
  1. (키워드)에 매핑된 것이 있는지 컨트롤러에서 우선순위로 확인
  2. 컨트롤러에 매핑정보가 없다면, static 파일에서 (키워드).html이 존재하는지 확인.

위 사실을 먼저 복습하고 넘어가자.

1. 회원 웹 기능 - 홈 화면추가.

1. 컨트롤러 코드

@Controller
public class HomeController {
    @GetMapping("/") // 뒤에 키워드가 입력되지 않는다면 매핑된다. default 같은 개념
    public String home() {
        return "home"; // home.html 파일로 이동
    }
}

2. home.html

<div class="container">
    <div>
        <h1>Hello Spring</h1>
        <p>회원 기능</p>
        <p>
            <a
                    href="/members/new">회원 가입</a>
            <a
                    href="/members">회원 목록</a>
        </p>
    </div>
</div> <!-- /container -->
</body>
</html>

3. 웹의 모습

단순하게 html을 반환한 모습이므로 설명은 생략.

2. 회원 웹 기능 - 등록

다음은 웹을 통해서 사용자가 이름을 입력하여 등록을 할 수 있도록 하는 기능이다.
1. 회원가입 버튼 컨트롤러 코드

@GetMapping(value = "/members/new") // get방식이다.
    public String createForm() {
        return "members/createMemberForm"; // create 맴버 폼으로 찾아간다. - 템플릿 html의 파일을 찾아간다.
        //html 의 form 에서 input이라는 것이 입력한느 곳 name이 key 가 되는 것임

    }
  • "/members/new" 의 경로를 매핑하는 이유는 위 홈화면에서 회원 가입 버튼을 누르면 넘어가지는 경로이기 때문이다.

2. creatMemberForm.html

html xmlns:th="http://www.thymeleaf.org">
<body>
<div class="container">

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

##html은 아직 배우지 않았지만 알아야할 정보만 적어보자면

  • form action="/members/new" method="post" : 메서드를 실행시킨 후 post방식으로 /members/new 경로에 접속한다.
  • type="text" id="name" name="name" placeholder="이름을 입력하세요"> :
    이때 입력을 받고 입력을 받은 값은 name, memberForm의 멤버변수로 입력된다.

3. 웹의 모습

이제 입력을 하고 받는 인터페이스를 제공했으니 서버에서 회원등록을 해야한다.

4. 웹 등록 화면에서 데이터를 전달 받을 폼 객체

public class MemberForm {
    private String name; // 여기에 매칭이 되면서 값이 들어온다.
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
}
  1. 위 html에서 name 변수를 통해서 사용자에게 입력을 받는다.
  2. 사용자에게 입력된 문자열 값을 spring에서 setName()을 통해 member에 name을 넣어준다.
@PostMapping(value = "/members/new") // <form action="/members/new" method="post">에서 포스트로 넘어올때의 매핑이다.
    public String create(MemberForm form) { //html 의 name을 통해서 스프링이 MemberForm의 멤버 변수에 넣어준다.(setname 호출)
        Member member = new Member();
        member.setName(form.getName()); // form에 저장된 이름을 꺼낸다.
        memberService.join(member); // 회원가입할때 join을 통해서 Mapping 시킴
        return "redirect:/"; // 다시 home화면으로 이동

    }
  • 웹에서 사용자가 입력후 등록 버튼을 누르면 "/members/new"로 포스트 형식으로 접근할때 실행되는 메서드
  1. member 클래스의 인스턴스를 가르키는 객체 선언
  2. 사용자가 입력한 이름이 spring을 통해서 form.name에 저장되어 있으므로 이를 member.Name으로 가져옴
  3. 이름을 받은 member 객체는 memberService를 통해서 HashMap형태로 저장.
  4. redirect:/(주소) : 주소로 이동하는 함수, 위코드에서는 아무 주소도 없으니home화면으로 돌아간다.

회원 웹 기능 - 조회

  • 다음은 회원등록한 정보들을 조회하는 기능이다.
    1. 회원 조회 컨트롤러 코드
@GetMapping(value = "/members")
    public String list(Model model) {
        List<Member> members = memberService.findMembers();
        model.addAttribute("members", members); // members의 문자열을 실제 객체로 치환한다는 뜻
        return "members/memberList";
    }
}
  1. 회원 조회 버튼을 눌렀을때 "/members" 주소를 받으므로 get형식 매핑
  2. Member 클래스의 객체를 받는 List를 반환하는 findmembers(); 함수를 사용하여 members에 반환
  3. model.addAttribute("members",members) : html에서 "members" 문자열 부분에 members 객체를 전달.
  4. 사용될 html 파일 반환

2.memberList.html

 <!DOCTYPE HTML>
 <html xmlns:th="http://www.thymeleaf.org">
 <body>
 <div class="container">
    <div>
        <table>
            <thead>
            <tr>
                <th>#</th>
                <th>이름</th>
            </tr>
            </thead>
            <tbody>
            <tr 
th:each="member : ${members}">
                <td 
th:text="${member.id}"></td>
                <td 
            </tr>
            </tbody>
        </table>
    </div>
 th:text="${member.name}"></td>
 </div> <!-- /container -->
 </body>
 </html>
  • 컨트롤러에서 전달한 members 를 받아서 안에 저장되어있는 회원 정보들을 id , 이름으로 구별하여 출력

3.웹의 모습

  • 이름을 'ㅁㄴㅇㄹ' 로 저장했을때 회원 조회 버튼을 누르면 나오는 모습이다.

소감

"스프링이 보이기 시작했다."

처음 spring 강의를 들을 때는 내가 알던 JAVA랑 아예 다른 언어같아서 이해가 되지 않아서 그냥 포기하고 싶었는데, 오늘도 같이 모각소를 하면서 억지로라도 계획한 웹 공부를 하게 되었다. 결과적으로, 오늘 웹을 통해 회원등록을 하게 되면서, 전체적인 웹의 작동방식이 눈에 들어오게 되어 spring에 거부감이 조금은 줄어든 것 같다.
다른사람과 같이 공부하는 것은 비효율적이라고 생각했는데, 같이 공부를 하기로한 책임감을 느끼게되니 공부를 더 열심히 하게되는 것 같다. 방학이 끝날 때까지 열심히 해보자.

profile
현재진행중

0개의 댓글