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
학습 참고자료
- 코드스쿼드 자바 백엔드 레벨3 과정 자료
- 스프링부트 docs
- 핸들바 docs