[The Lean Startup][Running Lean] 정리

[The Lean Startup][Running Lean] 정리

Lean Startup 


린 경령이란? 
- 성공한 스타트업이 훌륭한 초기 계획 (플랜 A라고 부른다)을 세우고 출발했기 때문이 아니라. 자원이 소진하기전에 성공적인 계획을 찾았기 때문이다.

왜 스타트업은 어려움을 겪는가?
1. 성공할 수 있는 제품을 만드는 방법의 오해
  - 미래를 내다보고 완벽한 과정을 계획하는 선지자의 이야기가 아니라. 점진적인 혁신 그리고 실패를 통해 탄생하였다.

2. 고객 참여에 대한 문제
  - 고객의 참여가 있지만, 고객의 검증은 출시 이후로 미루어지고, 제품의 개발 과정에서 고객과 격리된다.
  - 제품이 만들어지는 동안 고객의 참여를 끊임없이 반영하고 검증하는 과정이 필요하다.

3. 고객이 모든 답을 알더라도, 단순히 고객에게 그 답을 묻기만 해서는 안된다.
  - 만약 사람들에게 무엇을 원하는지 물었다면, 사람들은 더 빠른 말이 필요하다고 답했을 것이다. -- 헨리포드
  - 고객이 무엇을 원하는지 알아내는 것은 고객의 일이 아니다. -- 스티브잡스
  - 즉, 정확한 맥락과 상황을 주면 고객은 자신의 문제를 정확히 표현할 수 있다. 그러나 해결책을 찾는것은 당신의 몫이다.

더 낳은 방법?
- 속도 학습, 집중을 위한 방법
- 고객 행동 평가를 통해 비젼의 검증
- 제품 개발 주기 전체에서 고객을 참여시키기
- 짧은 반복 개선 과정을 통해 제품과 시장을 동시에 검증
- 원칙에 따라 엄격하게 운영

고객개발 
- 스티브 개리 블랭크가 만든 용어
- 개발 전체 과정에서 고객과 지속적인 피드백의 순환 고리를 만드는 과정
- 핵심 :
  사무실 밖으로 나가라   -- 스티브 개리 블랭크
- 답의 대부분은 회사 밖에서 얻을 수 있다. 컴퓨터나 연구실 안에는 답이 없다. 고객을 직접 만나야한다.

린 스타트업
- 에릭 리스의 트레이드 마크
- 고객개발, 애자일 소프트웨어 개발 방법론, 린 기법의 종합개념.
- 린 :
  낭비를 없애거나 자원을 효율적으로 사용하는 것을 의미한다.
- 목표 단위 시간당 (고객에 대한)학습을 극대화 하는 것
- 소규모의 빠른 개발을 통해서 비젼의 검증
성공하는 스타트업은 자원을 다 써버리기 전에 여러 번 충분한 개선 과정을 반복할 수 있는 스타트업이다.  -- 에릭리스
부트 스트래핑  
- 은행이나 투자나로부터 조달하는 외부 투자나 자금 규모를 최소화 하는데 사용하는 기법의 집합
- 린에서는 매출을 통해 자금을 조달하는 목표를 말한다.

적절한 시기, 적절한 행동
- 스타트업의 본질은 무질서하다.
- 그러나 중요한 핵심 행동은 몇개 밖에 없다. 이 행동에 초점을 맞추고 나머지는 무시하라.

Running Lean의 구성 
1. 로드맵을 작성하라.
  - 린의 정수를 담은 3가시 핵심 메타원칙
2. 플랜 A를 문서화 하라.
  - 린 캔버스의 작성
3. 사업 계획에서 가장 위험한 부분을 식별하라.
  - 사업 계획에서 가장 중요한 초점과, 위험 순위 결정방법 지정
4. 계획을 체계적으로 검증하라.
  - 제 1안을 검증하고 반복하는 방법

저자의 경험 
1. 비밀리에 제품을 구축
- 잘못된 생각이라 회상
- 처음 창업자는 자신의 아이디어를 남들이 훔칠 것으로 생각한다.
  a. 사람들은 대부분 아주 초기 단계일 때의 아이디어가 가진 잠재력을 간파하지 못한다.
  b. 결정적으로 사람들은 당신의 아이디어에 관심이 없다.

2. 아무도 원하지 않는 제품을 만들기에는 인생이 너무 짧다.

3. 고객의 말에 귀를 귀울이는 것은 매우 중요하지만, 그 방법을 알아야 한다.
  - 다양한 사용자 층중에서 어떤 사용자를 대상으로 할것인지 분명하지 않아서 피드백의 우선순위를 정하지 못했다고함.
  - 가장 많이 피드백 오는 것에 따르다 보면 일회성의 기능이 잔뜩 포함된 비대한 제품이 됨.

실천이 이론을 이긴다. 
- 어떤 과정을 따르냐가 중요한 것이 아니라. 결과를 내는 것이 목표가 되어야한다.
- 직접 경험하고 엄격히 검증해보고 상황에 맞게 조정하자.

왕도는 없다. 
- 어떤 방법도 성공을 보장하지 못한다.
- 하지만 지속적인 개선과 학습을 가능하게 하는 피드백 고리를 만들어 줄수 있는 방법은 있다. (이책이 그것이다. )


참고자료 :
The Lean Startup
Slide Share : Running Lean
RunningLean.co


[Spring] CSV 엑셀 다운로드시 한글 처리

[Spring] CSV 엑셀 다운로드시 한글 처리
Spring으로 웹 개발시 데이터를 CSV로 다운로드 하는 경우 컨텐츠 내용에 한글이 깨지는 경우가 발생한다.

다음과 같이 처리해주면 해결이 된다.


1. HttpServletResponse 를 Controller에 등록하기. 
public void listExcelExport(HttpServletResponse response) {
상기 내역처럼 response 객체가 필요하다.

2. request 객체에 컨텐츠 타입 설정하기. 
response.setContentType("application/ms-excel; charset=UTF-8");
response.setCharacterEncoding("UTF-8");
response.setHeader("Content-Disposition", "attachment; filename=" + fileName);
3. 출력 스트림을 생성하고 UTF-8 에 대한 BOM을 추가한다. 
OutputStream out = response.getOutputStream();
out.write(0xEF);
out.write(0xBB);
out.write(0xBF);
4. 이후 컨텐츠 내역을 출력한다. 
out.write(.... contents ....);
out.flush();

참고자료 : 
https://ko.wikipedia.org/wiki/%EB%B0%94%EC%9D%B4%ED%8A%B8_%EC%88%9C%EC%84%9C_%ED%91%9C%EC%8B%9D

참고자료를 요약하면 BOM (Byte Order Mark)로 유니코드의 엔디안을 구별하기 위해 사용하는 문자를 설정해준다.

이를 통해서 UTF-XXX에 따라 엔디안의 종류를 맞춰주는 작업을 한다.

즉 출력 스트림의 맨 앞에 BOM을 기술해서 어떠한 타입의 엔디안을 사용하는지 파악하여 정확하게 인코딩을 해줄 수 있게 된다.

EncodingRepresentation
UTF-8EF BB BF
UTF-16 빅 엔디안FE FF
UTF-16 리틀 엔디안FF FE
UTF-32 빅 엔디안00 00 FE FF
UTF-32 리틀 엔디안FF FE 00 00
SCSU0E FE FF
UTF-EBCDICDD 73 66 73
BOCU-1FB EE 28


[Spring Study] spring 설정

[Spring Study] spring 설정
Spring 프로젝트 환경 설정 

1. Spring framework 의존성 설정 
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>4.2.5.RELEASE</version>
</dependency>

2. POM 프로퍼티 설정 
<properties>
<java-version>1.8</java-version>
<org.springframework-version>4.2.5.RELEASE</org.springframework-version>
<org.aspectj-version>1.6.10</org.aspectj-version>
<org.sl4j-version>1.6.6</org.sl4j-version>
</properties>

3. Mysql Connect J 설정 
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.38</version>
</dependency>

4. try-with 구문 활용
try (Autoacloseable 인터페이스를 구현한 타입의 변수) {
작업하기
} catch (Exception) {
예외처리하기
}

5. JUnit 설정
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<scope>test</scope>
</dependency>

6. Mybatis / Mybatis-spring / spring-jdbc / spring-test 설정하기
<!— Mybatis —>
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.3.1</version>
</dependency>

<!— Mybatis spring —>
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis-spring</artifactId>
<version>1.2.4</version>
</dependency>

<!— spring-jdbc —>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>4.2.5.RELEASE</version> <!— 스프링의 버젼과 동일하게 맞춘다. —> 
</dependency>

<!— spring-test —>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-test</artifactId>
<version>4.2.5.RELEASE</version> <!— 스프링의 버젼과 동일하게 맞춘다. —> 
</dependency>

7. 기본적인 root-context 네임스페이스 설정하기
    1. aop
    2. beans
    3. context
    4. jdbc
    5. mybatis-spring

8. DataSource 설정하기
<bean id=“dataSource” class=“org.springframework.jdbc.datasource.DriverManagerDataSource”>
<property name=“driverClassName” value=“com.mysql.jdbc.Driver”/>
<property name=“url” value=“jdbc:mysql://127.0.0.1:3306/book_ex”/>
<property name=“username” value=“kido”/>
<property name=“password” value=“kids”/>
</bean>

9. Junit 테스트 (스프링 올려서 테스트하기)
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(
locations={“file:src/main/webapp/WEB-INF/spring/**/*.xml”})

10. Mybatis 연동
10.1 root-context.xml SqlSessionFactory 추가하기
< bean id=“sqlSessionFactory” class=“org.mybatis.spring.SqlSessionFactoryBean”>
<property name=“dataSource” ref=“dataSource”/>
<property name=“configLocation” value=“classpath:/mybatis-config.xml”/>
<property name=“mapperLocations” value=“class path:/mappers/**/*Mapper.xml”/>
</bean>
<!— SqlSession Template SqlSessionFactory 연결하기 —>
<bean id=“sqlSession” class=“org.mybatis.spring.SqlSessionTemplate” destroy-method=“clearCache” >
<constructor-arg name=“sqlSessonFactory” ref=“sqlSessionFactory”/>
</bean>

10.2 resources/mybatis-config.xml 추가하기
<?xml version=“1.0” encoding=“utf-8”?>
<!DOCTYPE configuration
PUBLIC “-//mybatis.org//DTD Config 3.0//EN”
<configuration>
</configuration>

11. Jackson Bind 연동
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.7.2</version>
</dependency>

상기내용 추가후 : @ResponseBody 해주면 된다

12. 자바 서블릿 API 추가. (서블릿 테스트를 하기 위해서 자동생성 버젼에서 3.1 올려준다. )
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>3.1.0</version>
</dependency>


13.  Mybatis-log4j 설정하기
<dependency>
<groupId>org.bgee.log4jdbc-log4j2</groupId>
<artifactId>log4jdbc-log4j2-jdbc4</artifactId>
<version>1.16</version>
</dependency>

<!— root context dataSource 수정하기 —>
<bean id=“dataSource” class=“org.springframework.jdbc.datasource.DriverManagerDataSource”>
<property name=“driverClassName” value=“net.sf.log4jdbc.sql.jdbcapi.DriverSpy”/>
<property name=“url” value=“jdbc:log4jdbc:mysql://127.0.0.1:3306/book_ex”/>
<property name=“username” value=“kido”/>
<property name=“password” value=“kido”/>
</bean>

<!— log4jdbc.log4j2.properties 생성 —>
log4jdbc.spylogdelegator.name=“net.sf.log4jdbc.log.slf4j.Slf4jSpyLogDelegator

<!— logback.xml 생성하기 —>
<?xml version=“1.0” encoding=“utf-8” ?>
<configuration>
<include resource=“org/springframework/boot/logging/logback/base.xml”/>

<logger name=“jdbc.sqlonly” level=“DEBUG”/>
<logger name=“jdbc.sqltiming” level=“INFO”/>
<logger name=“jdbc.audit” level=“WARN”/>
<logger name=“jdbc.resultset level=“ERROR”/>
<logger name=“jdbc.resultsettable” level=“ERROR”/>
<logger name=“jdbc.connection” level=“INFO”/>
</configuration>