TIL - 0509

알고리즘

하나를 풀더라도 제대로 풀자

  • 풀면서 알게된 것
1. 어떤 연산이라도 나머지 연산부터 해도 결과는 같음 : 숫자의 크기를 줄이는 것도 하나의 방법
2. 최대한 최대값으로 많이 나누려면 거기 조건에 맞을 때까지 맞춰주는게....
3. 코드짜고 성공 케이스, 실패 케이스 최소 4개씩 돌려보기
4. 자바 포맷 출력 : System.out.format("$format", value)
  • 오늘 푼 유형
1. 조합 중에 합이 가장 작은 것 구하기 : 작은 것을 하나씩 빼가면서 큰 것으로 나눠질 수 있도록
2. 연산 순서 : 나머지 연산 먼저해서 크기 줄이기

스프링부트 - 삽질 끝에 봄이 오나니…!

스프링부트 기본적인 내용 공부

  • 스프링부트 사용방법만 알기만 하는게 아니라 이해해야하므로 공부하게됨
  • 또한 스프링과 스프링부트의 차이점을 알고싶어 공부를 시작하게됨
  • 백기선님의 스프링부트 2.0 을 통해 스프링부트 docs를 보면서 공부를 시작하게됨
  • 알게된 사실
1. 스프링부트는 자바 라이브러리라서 gradle, maven에서 디펜던시 설정만 해주면 되거나, jar 파일을 다운로드 받아서 import만 시켜주면 됨
2. 웹어플리케이션 컨테이너(톰캣 등)가 내장되어있으므로 독자적으로 컨테이너를 다운로드 받거나 실행시키지않더라도 웹어플리케이션을 만들고 실행시켜서 서비스할 수 있음
3. 테스트 수준의 어플리케이션을 만드는 것이 아니라, 실제 서비스 가능한 수준의 어플리케이션을 스프링에 비해 쉽고 빠르게 만들 수 있는 것이 특징
4. 스프링부트는 쉽고 빠르게 설정해서 어플리케이션 만들기에 집중하게 만들어짐 그렇기때문에 환경설정이나 써드파티 버젼에 대해 몇버젼 이상을 강제하는 것이 있음
5. 

스프링부트 버젼 변경하기

  • 포크한 프로젝트의 버젼이 1.5.x 였는데, 2.0.1 버젼으로 변경해보았음
  • build.gradle에서 버젼만 변경하면 될 줄 알았지만, 스프링부트 버젼에 맞게 빌드툴, 써드파티 라이브러리도 버젼 설정을 해줘야했음
/* build.gradle */
buildscript {
    ext {
        springBootVersion = '2.0.1.RELEASE'
    }
    repositories {
        mavenCentral()
    }
    dependencies {
        classpath("org.springframework.boot:spring-boot-gradle-plugin:${springBootVersion}")
    }
}
  • 2.0.1.RELEASE 버젼 사용하기
    • gradle 최소 4.0 버젼을 사용해야함
    • 템플릿엔진 handlebars 기준 0.3.0 버젼을 사용해야 빌드 시 에러나지않음
  • 단순히 숫자만 바꿔서 gradle이 알아서하겠지가 아니라 docs를 참조하면서 사용하는 버젼에 따라 대처해야겠다는 생각을 하게됨
  • 스프링부트 설치 관련 docs
  • 관련 공부를 하게되던 중 알게된 사실
    • gradle 라이브러리 임포트할 때 dependency management 자동으로 관리해주도록 설정해주는 것이 좋음 : 이중 import 문제로 충돌에러날 수 있음
/* build.gradle */
apply plugin: 'io.spring.dependency-management'

간단하게 MVC 패턴으로 회원가입 구현하기

  • 사용자가 form을 통해 정보를 전송하면, 컨트롤러가 요청을 받아 일련의 처리 후(템플릿 뷰에 작업) 응답해주는 작업을 함
@Controller
public class UserController {
    
    @RequestMapping("/user/create")
    public String create(String name, String passwd, String email) {
        
        return "index";
    }
}
  • @Controller : 컨트롤러를 만들었더라도 해당클래스가 컨트롤러인지 알려주기위해 어노테이션으로 설정함
  • @RequestMapping : 해당 메소드가 어떤 url 요청을 받았을 때 동작할지 맵핑하는 어노테이션
  • create 메소드 파라미터 : form 버튼을 통해서 얻어온 사용자가 입력한 데이터
    • 파라미터가 많아진다면 고민해봐야함 : 클래스 추상화
    • 아래의 코드와 같이 User 클래스로 추상화함, 자바빈 규약을 지켜만들어두고 form의 name명과 클래스의 인스턴스변수명이 일치하면 스프링이 내부적으로 알아서 인스턴스를 생성함 -> 데이터베이스에 저장하거나, 저장이 필요없다면 사용만 하면 됨
    • user 인스턴스를 데이터베이스에 저장한다면 DAO 객체에 user 인스턴스를 전달해서 저장하는 작업을 위임시키면 될 것으로 생각됨
@Controller
public class UserController {
    
    @RequestMapping("/user/create")
    public String create(User user) {
        
        return "index";
    }
}

public class User {
    private String userId;
    private String passwd;
    private String name;
    private String email;

    public String getUserId() {
        return userId;
    }

    public void setUserId(String userId) {
        this.userId = userId;
    }

    public String getPasswd() {
        return passwd;
    }

    public void setPasswd(String passwd) {
        this.passwd = passwd;
    }

    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;
    }

    @Override
    public String toString() {
        return "User{" +
                "userId='" + userId + '\'' +
                ", passwd='" + passwd + '\'' +
                ", name='" + name + '\'' +
                ", email='" + email + '\'' +
                '}';
    }
}

  • return 데이터 : /src/main/resources/templates에 위치한 .html 파일의 이름, 컨트롤러에서 처리 후 해당 뷰 파일을 리턴해줌으로서 웹브라우저(클라이언트)는 해당 html 파일을 랜더링해서 사용자에게 보여줌
    • templates 파일을 맵핑시켜주면서 알게된 사실 : 스프링부트는 application.properties 에서 어플리케이션 관련 설정을 함
    • templates 디렉토리에 위치한 뷰 파일은 직접 접근하지못하고, 컨트롤러를 통해 접근할 수 있음
    • static 파일 요청만 할 부분과 동적인 데이터가 필요한 부분을 나눠야함 : 컨트롤러 처리가 필요한 부분(templates 위치)과 그렇지않은 부분(static 위치)
    • 우리에게 보이는 String은 “index” 지만 설정파일(application.properties)에 의해 index.html로 설정됨
/* application.properties */
handlebars.suffix=.html

학습 참고자료