... 좀 오래 걸렸다. 다음은... 저서가 될까나?

첫번째 번역서는... 조금 성의가 없었다.
두번째 번역서는... 조금 나아졌다.

the Java API for Microsoft Documents 을 지향하는Apache POI를 이용한 엑셀 생성 및 다운로드 기능 구현을 해보겠다.

현재 배포중인 버전에 대해서는 Maven central Repository 를 통해서 그때그때 확인하기 바란다.

1. 의존성 추가

1.1. pom.xml

<dependency>
    <groupId>org.apache.poi</groupId>
    <artifactId>poi</artifactId>
    <version>3.14</version>
</dependency>

1.2. build.gradle

compile ('org.apache.poi:poi:3.14')

2. 간단한 테스트

POI에 대한 의존성을 추가했으면 간단한 예제를 구현하여 엑셀과 관련된 WorkBook(=file), Sheet, Row, Cell 에 대한 기능을 확인하자.

@Slf4j
public class SheetServiceTest {
    /**
     * @throws Exception
     * @see <a href="https://poi.apache.org/spreadsheet/quick-guide.html#NewWorkbook"></a>
     */
    @Test
    public void generateWorkBook() throws Exception {
        List<Dump> dumps = generateDump(10, "a", "b", "c", "d");
        String excelFileName = "test.xls";
        String sheetname = "send-check-1";
 
        Workbook workbook = new HSSFWorkbook();
        workbook.createSheet(sheetname);
 
 
        Sheet sheet = workbook.getSheet(sheetname);
 
        int size = dumps.size();
        Row headerRow = sheet.createRow(0);
        headerRow.createCell(0).setCellValue("A column");
        headerRow.createCell(1).setCellValue("B column");
        headerRow.createCell(2).setCellValue("C column");
        headerRow.createCell(3).setCellValue("D column");
 
        for (int rownum = 0; rownum < size; rownum++) {
            Row row = sheet.createRow(rownum + 1);
            row.createCell(0).setCellValue(dumps.get(rownum).getA());
            row.createCell(1).setCellValue(dumps.get(rownum).getB());
            row.createCell(2).setCellValue(dumps.get(rownum).getC());
            row.createCell(3).setCellValue(dumps.get(rownum).getD());
        }
 
        generateExcel(Paths.get(excelFileName).toString(), workbook);
 
        assertThat(Paths.get(excelFileName).toFile().exists()).isTrue();
        assertThat(workbook.getSheet(sheetname)).isNotNull();
        assertThat(sheet.getLastRowNum()).isEqualTo(10);
        assertThat(sheet.getRow(sheet.getFirstRowNum()).getCell(0).toString()).isEqualTo("A column");
        assertThat(sheet.getRow(sheet.getLastRowNum()).getCell(0).toString()).isEqualTo("a9");
 
        Paths.get(excelFileName).toFile().delete();
    }
 
    private List<Dump> generateDump(int it, String a, String b, String c, String d) {
        List<Dump> dumps = Lists.newArrayList();
        for (int i = 0; i < it; i++) {
            dumps.add(Dump.builder().a(+ "" + i).b(+ "" + i).c(+ "" + i).d(+ "" + i).build());
        }
        return dumps;
    }
 
    private void generateExcel(String filePath, Workbook workbook) {
        log.debug("generate excel: {}", filePath);
        try (FileOutputStream fileOut = new FileOutputStream(filePath);) {
            workbook.write(fileOut);
        } catch (Exception e) {
            log.error("Occur exception: {}", e);
        }
    }
 
    @Data
    @NoArgsConstructor
    @AllArgsConstructor
    @Builder
    public static class Dump {
        String a;
        String b;
        String c;
        String d;
    }
}

3. 스프링MVC 에서 구현

스프링에서 제공하던 AbstractExcelView 는 4.2 에서 Deprecated되었다. AbstractXlsView 를 사용해볼까 했는데 apache POI 3.14 버전에서는 XSSFWorkbook 관련한 패키지가 사라져서 쓸 수 없다. 3.16 버전에는 SXSSFWorkbook 관련 패키지가 추가될 것으로 보이니 3.16 쓸 때는 SXSSFWorkbook 사용을 고려해보자. AbstractXlsView를 사용하도록 하자.

3.1. AbstractXlsView 을 구현

@Component("downloadXlsView") // 공통적으로 사용할 수도 있고... 특정 기능에 따라 뷰이름을 구분지어 사용할 수 있겠다. 
public class SendCheckRequestExportXlsView extends AbstractXlsView {
  // 코드는 중략... 상상의 나래를 활짝 펴라~ 
  @Override
    protected void buildExcelDocument(Map<String, Object> model, Workbook workbook, HttpServletRequest request, HttpServletResponse response) throws Exception {
 
    }
}

org.springframework.web.servlet.view.document 패키지에AbstractXlsView 와 AbstractPdfView 가 있다. AbstractXlsxView는 AbstractXlsView 를 확장했는데 import org.apache.poi.xssf.usermodel.XSSFWorkbook 를 필요로 한다. 그런데 POI 3.14 에는 org.apache.poi.xssf 패키지가 빠져있다. 히스토리는 모르겠다.

3.2. Controller 에서 view 를 반환

@Controller
public class DownloadController {
  @RequestMapping("/download-xls")
  public ModelAndView() {
    // view 에서 처리하는데 필요한 데이터를 담아주면 되겠다. 
    return new ModelAndView("downloadXlsView", "model", model);
  }
}

이렇게 하고 이 컨트롤러에 대한 링크를 제공하면 다운로드 처리가 완료된다.

<a href="/download-xls"></a>

4. 정리

엑셀에 필요한 정보를 담기 위해서는 여전히 많은 노력이 필요하다. 뭐 그래도 어떤 데이터들을 출력할지만 정의하면 비교적 처리가 수월해진다.


일단 써보기 시작.






DDD Start 의 저자, 최범균님의 북콘서트가 있었다.

주제는 '수다' 부제는 약팔기.


DDD(Domain Driven Development) 의 난해함은 많은 개발자들에게 부담을 준다.

개발하는 비즈니스 로직의 복잡함을 해소 하기위한 해결책으로 제시된 것이 DDD 다.



독자의 곁으로 다가가는 저자의 사인회.

사인을 하면서 도란도란 이야기를 나누는 모습이 보기 좋았다.



저자의 사인 받기.

건강을 기원하는 말들을 적어주셨다.

건강제일!



지앤선 김지영 실장님의 인삿말을 시작으로 세미나가 시작된다.



쿠팡의 최용은님이 쿠팡의 정산과 관련하여 MSA(MicroService Architecture) 적용 사례에 대한 경험을 공유했다.

그러고보니!! 라이트닝 토크를 할 때 쯤 장진달님이 +_+) 안보이셨다.



DDD 를 하게 되면, CQRS(Command Query Responsibility Segregation) 에 대한 경험을 공유해주셨다.

2시간 만에 접수가 끝난 콘서트에 초대권을 미끼로 좋은 경험을 공유해주셨다.

테스트를 하다가 CQRS 를 하다가 DDD 공부도 하게 된 이야기.


간단하게 정리하자면 CUD(Create-Update-Delete) 와 R(Read) 를 분리하여 성능을 향상시키는 아키텍처에 대한 이야기랄까.....



최범균님과 박용권님이 DDD에 대한 질문에 대한 답변을 주거니 받거니 만담을 나눈다.



그리고 마무리!

DDD 에 대해서 좋은 예제와 함께 쉽게 풀어서 설명한

범균님의 책이 많이 팔릴 수 있기를 바란다. ^^



'logbook' 카테고리의 다른 글

오류를 느끼는 감각  (0) 2016.08.08
곧 나올 나의 두번째 번역서  (0) 2016.08.06
20160714; RecruitingDay: Developer  (0) 2016.07.15
20160619 KSUG 경력관리 세미나  (0) 2016.06.19
(0).5 M/M 의 신화  (0) 2016.05.11

지난 목요일(2016/07/14) 삼성동에 위치한 구글 캠퍼스 서울에서

'스타트업 기업의 구인행사' Recruiting Day: Developer 행사가 있었습니다.



참여한 업체는 우아한형제들, 미미박스, 마이뮤직테이스트, 리멤버드라마앤컴퍼니, 핀다, 다노, 하이퍼커넥트, 레이니스트, 버드뷰, 밸런스 히어로 였다.

 



서초에 있는 SK 브로드밴드 IDC 에서 일을 마치고 달려갔을 때는 이제 막 입장이 시작되고 있었다. 행사 참여와 함께 구글 캠퍼스 입장절차를 진행중인 사람들로 입구는 인산인해였다. 



성장하고 있는 기업에는 성장을 위한 원동력을 제공하는 개발자를 필요로 한다. 참여한 기업들이 찾아오는 개발자들을 자유롭게 맞이한다.

일반적인 취업박람회와는 다르게, 개발자들에게 적극적으로 구애활동을 하는 기업들이 찾아왔다. 



행사에 참여한 개발자들은 기업부스에 찾아가 기업 담당자들과 이야기하면서 기업을 살펴보려는 노력을 부단히 했다. 다양한 경력을 가진 개발자들이 찾아들었다.



내가 개발자로서 버티면서 성장할 수 있는데 도움을 주셨던 임성현님이 한편에서 취업을 위한 클리닉에서 다른 개발자들과 이런저런 이야기를 하고 있었다.



취업과 관련된 간단한 토의를 마치고 부스를 나눠 자신의 회사를 소개하고 찾아온 사람들과 이야기를 나눴다.



버드뷰의 스티커는 마음에 든다.



미미박스가 뷰티를 컨텐츠로 하는 기업인 건 알았는데, 화장품을 제조하는 곳인 줄은 몰랐다. 호우.

꽤 품평이 좋다는 이야기에 급히 부스로 찾아가 경품을 받았다.



미미박스는 지난번 고랭 컨퍼런스에서 구인홍보를 했을 때 처음 만났는데,

우리나라가 가진 몇 안되는 경쟁력 중 하나인 '뷰티' 를 잘 이용하는 스타트업이라고 생각하고 있다. 


전체직원 중에 여성직원 비율이 80% 가 넘는다고 한다. 남자가 대부분인 개발자들에게는 매력적인 요소일 수도 있다.

그러나, 기본적으로 남성과 여성의 커뮤니케이션이 어려운데, 거기에 인간과의 대화가 어색한 개발자들에게는 오히려 더욱 진입하기 어려운 기업일 수도 있다.

어쨌든, 미미박스는 앞으로도 꾸준하게 성장할 수 있는 좋은 기업이라고 생각한다.

한번 도전해보길 바란다.



내 영어이름은 Jake.

기록할 때는 Jake JiHeon Kim.



'logbook' 카테고리의 다른 글

곧 나올 나의 두번째 번역서  (0) 2016.08.06
20160717: DDD Start, KSUG & 지앤선 북콘서트  (0) 2016.07.17
20160619 KSUG 경력관리 세미나  (0) 2016.06.19
(0).5 M/M 의 신화  (0) 2016.05.11
20160411 - 퇴사  (2) 2016.04.12

+ Recent posts