본문 바로가기
카테고리 없음

Java & SpringBoot로 시작하는 웹 프로그래밍 : 자바 인강 [6주차]

by 소윤:) 2022. 7. 26.
반응형
Spring Boot

1. Intellij 설치하기

Jet Brain 의 IntelliJ 30일 무료평가판으로 설치

기존에 사용하던 Eclipse와 비교했을 때 코딩이 편함

평가판과 커뮤니티 버전이 차이가 있어 사용기간이 끝난 후 커뮤니티버전으로 계속 사용할지는 고민중

2. 디자인패턴

자주 사용하는 설계 패턴을 정형화해서 최적의 방법으로 개발할 수 있도록 유형별로 정해둔 설계

알고리즘과 유사, 프로젝트의 상황에 맞추어 적용가능

개발자간의 원활한 소통이 가능하며고 소프트웨어 구조 파악이 용이하며 설계 변경 요청에 대한 유연한 대처가 가능하다는 장점이 있으나 초기 투자 비용 부담이 있다는 단점이 있다.

1) 생성패턴

 객체를 생성하는 것과 관련된 패턴, 객체의 생성과 변경이 전체 시스템에 미치는 영향을 최소화

 Factory Method, Singleton, Prototype, Builder, Abstract Factory, Chaining

2) 구조패턴

 프로그램 내의 자료구조나 인터페이스 구조 등 프로그램 구조를 설계하는데 활용

 Adapter, Composite, Bridge, Decorator, Facade, Flyweight, Proxy

3) 행위패턴

 반복적으로 사용되는 객체들의 상호작용을 패턴화

 Template Method, Interpreter, Iterator, Observer, Strategy, Visitor, Chain of responsibility, Command, Mediator, State,   Memento

 

  • Singleton Pattern

어떠한 클래스가 유일하게 1개만 존재할 때 사용

TCP Socket 통신에서 서버와 연결된 connect 객체에 주로 사용

package com.company.design.singleton;

public class AClazz {
    private SocketClient socketClient;

    public AClazz(){
        this.socketClient=SocketClient.getInstance();
        //this.socketClient=new SocketClient();
    }
    public SocketClient getSocketClient(){
        return this.socketClient;
    }
}
package com.company.design.singleton;

public class BClazz {
    private SocketClient socketClient;

    public BClazz(){
        this.socketClient=SocketClient.getInstance();
        //this.socketClient=new SocketClient();
    }
    public SocketClient getSocketClient(){
        return this.socketClient;
    }
}
package com.company.design.singleton;

public class SocketClient {

    private static SocketClient socketClient=null;

    public SocketClient(){}

    public static SocketClient getInstance(){
        if(socketClient==null){
            socketClient=new SocketClient();
        }
        return socketClient;
    }
    public void connect(){
        System.out.println("connect");
    }
}
import com.company.design.singleton.AClazz;
import com.company.design.singleton.BClazz;
import com.company.design.singleton.SocketClient;

public class Main {
    public static void main(String[] args) {
    	AClazz aClass=new AClazz();
        BClazz bClazz=new BClazz();

        SocketClient aClient=aClass.getSocketClient();
        SocketClient bClient=bClazz.getSocketClient();

        System.out.println("두개의 객체가 동일한가?");
        System.out.println(aClient.equals(bClient));
	}
}

  • Adapter Pattern

호환성이 없는 기존 클래스의 인터페이스를 변환하여 재사용

package com.company.design.adapter;

public interface Electronic220V {
    void connect();
}

public interface Electronic110V {
    void powerOn();
}
package com.company.design.adapter;

public class SocketAdapter implements Electronic110V {

    private Electronic220V electronic220V;
    public SocketAdapter(Electronic220V electronic220V){
        this.electronic220V=electronic220V;
    }
    @Override
    public void powerOn() {
        electronic220V.connect();
    }
}

3. 웹 개발

웹에서는 다양한 방식으로 데이터 전달(HTML, XML, JSON, TEXT 등)

요청하는 데이터가 어떻게 처리되어야 하는지 충분한 데이터를 포함할 수 있어야 함

GET : 사용자의 정보요청

POST : 사용자 정보 생성

PUT : 사용자 정보 생성 및 수정

DELETE : 사용자 정보 삭제

 

URI : 인터넷에서 특정 자원을 나타내는 유일한 주소 값

URL : 인터넷 상에서의 자원, 특정 파일이 어디에 위치하는지 식별하는 주소

 

HTTP :  TCP를 기반으로 한 REST의 특징을 모두 구현하고 있는 Web기반의 프로토콜

Method 의미
GET 리소스 취득
POST 리소스 생성, 추가
PUT 리소스 갱신, 생성
DELETE 리소스 삭제
HEAD 헤더 데이터 취득
OPTIONS 지원하는 메소드 취득
TRACE 요청메시지 반환
CONNECT 프록시 동작의 터널 접속으로 변경

4. 스프링부트 시작하기

스프링부트는 프로덕션 제품 수준의 스프링 기반 어플리케이션을 쉽게 구현

간단한 설정으로 개발 및 커스텀이 가능

  • REST Client 설치하기 - Talend API Tester

  • Hello API 만들기
package com.example.hello.controller;

import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController //해당클래스는 REST API 처리
@RequestMapping("/api") //RequestMapping URI 지정
public class ApiController {
    @GetMapping("/hello")
    public String hello(){
        return "hello spring boot!";
    }
}

 

import com.example.hello.dto.UserRequest;
import org.springframework.web.bind.annotation.*;

import java.io.StringWriter;
import java.util.Map;

@RestController
@RequestMapping("/api/get")
public class GetApiController {

    @GetMapping(path="/hello")  //http://localhost:9090/api/get/hello
    public String Hello(){
        return "get hello";
    }

    @RequestMapping(path="/hi",method= RequestMethod.GET)   //get http://localhost:9090/api/get/hi
    public String hi(){
        return "Hi";
    }

    //http://localhost:9090/api/get/path-Variable/{name}

    @GetMapping("/path-variable/{name}")
    public String pathVariable(@PathVariable(name="name") String pathName){
        System.out.println("PathVariable : " +pathName);
        return pathName;
    }

    //http://localhost:9090/api/get/query-param?user=steve&email=steve@gmail.com&age=30
    @GetMapping(path="query-param")
    public String queryParam(@RequestParam Map<String, String> queryParam){

        StringBuilder sb = new StringBuilder();

        queryParam.entrySet().forEach(entry -> {
            System.out.println(entry.getKey());
            System.out.println(entry.getValue());
            System.out.println("\n");

            sb.append(entry.getKey()+" = "+entry.getValue()+"\n");
        });
        return sb.toString();
    }

    @GetMapping("query-param02")
    public String queryParam02(
            @RequestParam String name,
            @RequestParam String email,
            @RequestParam int age
    ){
        System.out.println(name);
        System.out.println(email);
        System.out.println(age);
        return name+" "+email+" "+age;
    }

    @GetMapping("query-param03")
    public String queryParam03(UserRequest userRequest){
        System.out.println(userRequest.getName());
        System.out.println(userRequest.getEmail());
        System.out.println(userRequest.getAge());
        return userRequest.toString();
    }
}
package com.example.hello.dto;

public class UserRequest {
    private String name;
    private String email;
    private int age;

    public String getName() {
        return name;
    }

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

    public String getEmail() {
        return email;
    }

    public void setEmail(String email) {
        this.email = email;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    @Override
    public String toString() {
        return "UserRequest{" +
                "name='" + name + '\'' +
                ", email='" + email + '\'' +
                ", age=" + age +
                '}';
    }
}

 

반응형